3

为什么不var foo = foo扔一个ReferenceError

注意:foo = foo确实抛出一个ReferenceError.

4

4 回答 4

5

当你声明

var foo = ...

您声明整个范围的变量(如果不是全局的,那就是您的函数),而不仅仅是之后的代码,这与其他语言相反。

所以在赋值的右边部分,foo已经声明了,即使它仍然是undefined. 没有参考错误。

请注意,javascript 中 var 声明的这个属性可能是错误的来源。因为您很可能拥有(更复杂的)这种代码:

if (true) {
    var a = 3; // do you think this is "local" ?
}
var a;
alert(a); // a is 3, did you expect it ?
于 2012-10-24T20:48:21.483 回答
2

据推测,变量声明是在 Javascript 中提升的。这意味着代码

function bar() {
    // some other code
    var foo = foo;
}

相当于:

function bar() {
    var foo;
    // some other code
    foo = foo;
}

事实上,即使是以下工作:

function bar() {
    return foo;
    var foo;
}

(并返回undefined。)

于 2012-10-24T20:51:31.150 回答
1

JavaScript 将 var 声明排序到顶部,因此在赋值时它已经声明(即使未定义):

var foo;
foo = foo;
于 2012-10-24T20:49:02.933 回答
0

当您使用 var 关键字时

var foo = foo

JavaScript 提升创建 foo 并在代码执行之前为其分配未定义的值。所以你可以在这里为它分配任何值 foo 并且 foo 本身是未定义的,所以实际上你再次通过同一个变量将 undefined 分配给 foo

当你在做

富=富

您没有之前定义的左侧 foo 来为其分配值。

当你在做

var foo = 酒吧

您之前没有定义 bar 。

于 2012-10-24T20:58:55.407 回答