在JavaScript和var关键字的分配
我正在阅读“学习节点”一书,我陷入了一个非常简单的问题,一个我没有考虑过的问题:javascript中的赋值。
作者指出,我们应该认识到,通过使用Node的REPL,以下将返回undefined:
var a = 2 (undefined)
而下面的代码将在REPL中返回“2”:
a = 2 2
这是为什么? 上面的代码不是属性? 怎么来的? 如果var'a'在代码中的那一点还没有存在,那么它怎么不是和归属?
根据ECMA-262§12.2 ,一个VariableStatement (也就是var identifier=value
)显式地不返回任何内容。 另外,一个VariableStatement是一个陈述; 语句不会返回值,并且将expression式放置到某个地方是无效的。
例如,以下任何一个都没有意义,因为他们在需要产生价值的expression式中放置一个Statement:
var a = var b; function fn() { return var x; }
根据§11.13.1 , 赋值给variables( identifier=value
)返回赋值。
当你写var a = 1;
它声明a
初始值为1
。 因为这是一个VariableStatement ,它什么也没有返回,并且REPL打印undefined
。
a=1
是一个给a
赋值1
的expression式。 由于不存在a
,因此JavaScript会在普通代码中隐式创build全局 a
(但由于不允许在严格模式下隐式创build新的全局variables,所以会在严格模式下抛出ReferenceError
)。
不pipe之前是否存在,expression式仍然返回分配的值1
,所以REPL打印该值。
只是在这里猜测 – 这可能可以通过参考ECMAScript第5版规范来validation(但是这个东西是一个痛苦) – 它可能与“var”语句的规范和将属性分配给“全局”对象。
当你声明一个variables并赋值给它( var a=2
)时,返回的值可能是“undefined”,因为这就是spec说“var”语句应该返回的值。
当您不使用“var”语句将variables分配给符号时,实际上是将值分配给该名称的全局对象的属性。 也就是说, a=2
和说window.a=2
a=2
是一样的,我们知道赋值给一个属性会返回赋值。
var a = 2
是一个语句。 因此它没有价值。
您正在评估一个声明列表。 评估语句列表时,返回最后一个生成值的语句的值。 http://ecma-international.org/ecma-262/5.1/#sec-12.1 – 注意本节最后的例子。 如果列表中没有语句返回值,则不会返回任何值(这在JavaScript中是undefined
的)。
variables语句不返回一个值。 http://ecma-international.org/ecma-262/5.1/#sec-12.2
赋值运算符确实返回一个值(以及执行赋值)。 http://ecma-international.org/ecma-262/5.1/#sec-11.13.1