在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