具体来说,就是当执行流进入下列任何一个语句时,作用域链就会得到加长:
□: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;
}
