With 块中的变量声明

Variable Declarations in a With Block

首先我要说我知道使用 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 内而不是在全局范围内创建。

var 声明已挂起。所以你正在执行的相当于

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

声明在 with 块内并不重要。 §9.2.12 describes what happens when the function body is evaluated. In step 11/12, all variable declarations are collected. A with statement simply "forwards" all the declarations inside of it (see spec).

变量声明(使用 var)不遵守块范围,而是 hoisted 到范围的顶部。就 compiler/interpreter 而言,您的代码实际上是:

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