为什么var foo = foo
不会抛出ReferenceError
?
注意:foo = foo
会抛出ReferenceError
。
答案 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
您之前没有定义过条形码。