首页 > 专栏 > 前端 > 文章详情
js 延长作用域链-等闭包测试 发布于:2021-03-05 12:19:48   原创发表   查看:9  讨论:0
具体来说,就是当执行流进入下列任何一个语句时,作用域链就会得到加长:26A易塔云建站-模板下载,web开发资源,技术博客
    □:try-catch语句的catch块。会创建新的变量对象,是抛出的错误对象的声明。26A易塔云建站-模板下载,web开发资源,技术博客
    □:with语句。将指定的对象添加到作用域链中。
function buildUrl(){26A易塔云建站-模板下载,web开发资源,技术博客
    var qs = "&name=sss";26A易塔云建站-模板下载,web开发资源,技术博客
    with(location){26A易塔云建站-模板下载,web开发资源,技术博客
        var url = href + qs26A易塔云建站-模板下载,web开发资源,技术博客
    }26A易塔云建站-模板下载,web开发资源,技术博客
    return url;26A易塔云建站-模板下载,web开发资源,技术博客
}26A易塔云建站-模板下载,web开发资源,技术博客
alert(buildUrl());
with语句会把location对象加载到当前函数的作用域中,而函数体内的href是location.href。qs是在函数体内查找,没找到继续往上找,在buildUrl()函数变量中找到了。如果在with函数中也定义了 qs ,那么就不用往外继续查找了。26A易塔云建站-模板下载,web开发资源,技术博客
由于with语句加载的是一个变量对象,那么我们换一下location。
var a = {26A易塔云建站-模板下载,web开发资源,技术博客
    href : "http://www.baidu.com/",26A易塔云建站-模板下载,web开发资源,技术博客
    // qs: "sfasdfasf"26A易塔云建站-模板下载,web开发资源,技术博客
}26A易塔云建站-模板下载,web开发资源,技术博客
var b = {26A易塔云建站-模板下载,web开发资源,技术博客
    qs: "?debug=true"26A易塔云建站-模板下载,web开发资源,技术博客
}26A易塔云建站-模板下载,web开发资源,技术博客
function buildUrl(){26A易塔云建站-模板下载,web开发资源,技术博客
    jw = "&name=sss";26A易塔云建站-模板下载,web开发资源,技术博客
    with(a,b){26A易塔云建站-模板下载,web开发资源,技术博客
        var url = a.href + b.qs + jw;26A易塔云建站-模板下载,web开发资源,技术博客
    }26A易塔云建站-模板下载,web开发资源,技术博客
    return url;26A易塔云建站-模板下载,web开发资源,技术博客
}26A易塔云建站-模板下载,web开发资源,技术博客
console.log(buildUrl());//https://www.baidu.com/?debug=true&name=sss
由于这道题说的是延长作用域链问题,使用a和b这两个对象,对buildUrl函数的作用域进行了延长。我没有测试a、b是函数的情况。等整理完闭包后再做测试。26A易塔云建站-模板下载,web开发资源,技术博客
26A易塔云建站-模板下载,web开发资源,技术博客
现在来测试一种方法:(在函数外访问函数内部不同变量)
function c(){26A易塔云建站-模板下载,web开发资源,技术博客
    var cURL1 = "http://www.taobao.com/";26A易塔云建站-模板下载,web开发资源,技术博客
    var cURL2 = "http://www.jd.com/";26A易塔云建站-模板下载,web开发资源,技术博客
    return cURL1 + "@" + cURL2;26A易塔云建站-模板下载,web开发资源,技术博客
}26A易塔云建站-模板下载,web开发资源,技术博客
var cc = c();26A易塔云建站-模板下载,web开发资源,技术博客
var arr = cc.split("@");//把带有返回值的函数,切割成数组,用数组的[]语法来获得不同参数值。26A易塔云建站-模板下载,web开发资源,技术博客
console.log(arr[0]);
26A易塔云建站-模板下载,web开发资源,技术博客
更改后的函数变为:26A易塔云建站-模板下载,web开发资源,技术博客
 
function buildUrl(){26A易塔云建站-模板下载,web开发资源,技术博客
    jw = "&name=sss";26A易塔云建站-模板下载,web开发资源,技术博客
    with(a,b,c){26A易塔云建站-模板下载,web开发资源,技术博客
        var cc = c();26A易塔云建站-模板下载,web开发资源,技术博客
        var arr = cc.split("@");26A易塔云建站-模板下载,web开发资源,技术博客
        var url = a.href + b.qs + arr[1];26A易塔云建站-模板下载,web开发资源,技术博客
    }26A易塔云建站-模板下载,web开发资源,技术博客
    return url;26A易塔云建站-模板下载,web开发资源,技术博客
}

评论

  • 匿名