function buildUrl() {
    var qs = "?debug=true";
    with(location) {
        var url = href + qs;
    }
    return url;
}为什么最后能够返回url这个变量?有点迷js高级程序设计上的原话看不懂:"至于with 语句内部,则定义了一个名为 url 的变量,因为 url 就成为了函数执行环境的一部分,所以可以作为函数的值被返回"我的理解是:with 语句不是全局作用域也不是函数作用域,所以能够返回buildUrl函数内能够获取 url变量;
类似这样:{
    var a = 5
}
console.log(a)
希望大佬能够解释下

解决方案 »

  1.   

    看到后面4.2.2 中的声明变量中有一句:"使用 var 声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在 with 语句中,最接近的环境是函数环境。"
      

  2.   

    with语句將某个对象添加到作用域链的顶部,如果在{}中有某个未使用命名空间的变量,跟作用域链中的某个属性同名,则这个变量将指向这个属性值。如果沒有同名的属性,则将拋出ReferenceError异常。在with(){}中只能访问和修改添加对象的已有属性,不能为对象增加新属性。
    var只作用于函数作用域或全局作用域。不作用于with添加的用域链。
    就算用 let 也只是声明with()的{}语句块的块作用域变量,与with添加的用域链也没有关系。