为什么不var foo = foo
扔一个ReferenceError
?
注意:foo = foo
确实抛出一个ReferenceError
.
当你声明
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 ?
据推测,变量声明是在 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
。)
JavaScript 将 var 声明排序到顶部,因此在赋值时它已经声明(即使未定义):
var foo;
foo = foo;
当您使用 var 关键字时
var foo = foo
JavaScript 提升创建 foo 并在代码执行之前为其分配未定义的值。所以你可以在这里为它分配任何值 foo 并且 foo 本身是未定义的,所以实际上你再次通过同一个变量将 undefined 分配给 foo
当你在做
富=富
您没有之前定义的左侧 foo 来为其分配值。
当你在做
var foo = 酒吧
您之前没有定义 bar 。