【问题标题】:Variable Declarations in a With BlockWith 块中的变量声明
【发布时间】:2017-04-17 20:39:01
【问题描述】:

我首先说我知道使用with 是非常不鼓励的,我也不打算使用它。我只是想了解它是如何工作的(我正在尝试找出 javascript 中的范围)。

如果我有这样的代码:

function foo(obj) {
    with (obj) {
        b = 2;
    }
}

var o1 = {
    a: "something"
};

foo( o1 );
console.log(o1.b) // This outputs undefined (makes sense)
console.log(b) // This outputs 2 (makes sense)

但是,如果我将 foo 更改为以下内容:

function foo(obj) {
    with (obj) {
        var b = 2; // I use var b instead of b
    }
}

当我再次将 o1 传递给 foo 时,o1 没有属性 b。为什么是这样?我认为使用var 会在 obj 的范围内声明 b,因此该属性将在 o1 内而不是在全局范围内创建。

【问题讨论】:

    标签: javascript scope lexical-scope


    【解决方案1】:

    var 声明被提升。所以你正在执行的相当于

    function foo(obj) {
        var b;
        with (obj) {
            b = 2;
        }
    }
    

    声明位于with 块内并不重要。 §9.2.12 描述了评估函数体时发生的情况。在步骤 11/12 中,收集所有变量声明。 with 语句只是“转发”其中的所有声明 (see spec)。

    【讨论】:

      【解决方案2】:

      变量声明(使用var)不考虑块作用域,而是将hoisted 放在作用域的顶部。就编译器/解释器而言,您的代码实际上是:

      function foo(obj) {
          var b = undefined;
          with (obj) {
              b = 2;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2017-09-06
        • 2015-02-03
        • 1970-01-01
        • 2014-04-16
        相关资源
        最近更新 更多