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;
}
}
首先我要说我知道使用 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;
}
}