为什么{var foo = foo}没有抛出一个ReferenceError?

时间:2012-10-24 20:47:29

标签: javascript scope

为什么var foo = foo不会抛出ReferenceError

注意:foo = foo会抛出ReferenceError

4 个答案:

答案 0 :(得分: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 ?

答案 1 :(得分: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。)

答案 2 :(得分:1)

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

var foo;
foo = foo;

答案 3 :(得分:0)

使用var关键字

  

var foo = foo

JavaScript提升会在代码执行之前创建foo并将其指定为未定义的值。所以你可以为它赋予任何foo值,而foo本身是未定义的,所以实际上你又通过相同的变量将未定义赋值给foo

当你做的时候

  

foo = foo

您之前没有定义左侧foo来为其指定值。

当你做的时候

  

var foo = bar

您之前没有定义过条形码。