js 延长作用域链-等闭包测试

具体来说,就是当执行流进入下列任何一个语句时,作用域链就会得到加长:
    □:try-catch语句的catch块。会创建新的变量对象,是抛出的错误对象的声明。
    □:with语句。将指定的对象添加到作用域链中。

function buildUrl(){
    var qs = "&name=sss";
    with(location){
        var url = href + qs
    }
    return url;
}
alert(buildUrl());

with语句会把location对象加载到当前函数的作用域中,而函数体内的href是location.href。qs是在函数体内查找,没找到继续往上找,在buildUrl()函数变量中找到了。如果在with函数中也定义了 qs ,那么就不用往外继续查找了。
由于with语句加载的是一个变量对象,那么我们换一下location。

var a = {
    href : "http://www.baidu.com/",
    // qs: "sfasdfasf"
}
var b = {
    qs: "?debug=true"
}
function buildUrl(){
    jw = "&name=sss";
    with(a,b){
        var url = a.href + b.qs + jw;
    }
    return url;
}
console.log(buildUrl());//https://www.baidu.com/?debug=true&name=sss

由于这道题说的是延长作用域链问题,使用a和b这两个对象,对buildUrl函数的作用域进行了延长。我没有测试a、b是函数的情况。等整理完闭包后再做测试。

现在来测试一种方法:(在函数外访问函数内部不同变量)

function c(){
    var cURL1 = "http://www.taobao.com/";
    var cURL2 = "http://www.jd.com/";
    return cURL1 + "@" + cURL2;
}
var cc = c();
var arr = cc.split("@");//把带有返回值的函数,切割成数组,用数组的[]语法来获得不同参数值。
console.log(arr[0]);


更改后的函数变为:
 

function buildUrl(){
    jw = "&name=sss";
    with(a,b,c){
        var cc = c();
        var arr = cc.split("@");
        var url = a.href + b.qs + arr[1];
    }
    return url;
}