javascript中的赋值和var关键字

Dra*_*nar 6 javascript browser node.js

我正在阅读"学习节点"一书,我陷入了一个非常简单的问题,一个我没有过多思考的问题:javascript中的赋值.

作者声明我们应该意识到通过使用Node的REPL,以下将返回undefined:

var a = 2
(undefined)
Run Code Online (Sandbox Code Playgroud)

而下面的代码将在REPL中返回'2':

a = 2
2
Run Code Online (Sandbox Code Playgroud)

这是为什么?上面的代码不是归属?怎么会?如果var'a'在代码中的那一点之前就不存在了,那么它是怎么回事?

jos*_*736 7

根据ECMA-262§12.2,VariableStatement(即var identifier=value)明确地不返回任何内容.另外,VariableStatement是一个Statement; 语句不返回值,将Statement放在某个表达式的位置是无效的.

例如,以下任何一个都没有意义,因为它们将一个Statement放在需要产生值的表达式的位置:

var a = var b;
function fn() { return var x; }
Run Code Online (Sandbox Code Playgroud)

根据§11.13.1,赋值给variable(identifier=value)返回赋值.


当你写作时var a = 1;,它宣告a并将其价值初始化为1.因为这是一个VariableStatement,它不返回任何内容,并且打印REPL undefined.

a=1是一个分配1给的表达式a.由于没有a,JavaScript会在正常代码中隐式创建一个全局 a(但会抛出一个ReferenceError严格模式,因为你不允许在严格模式下隐式创建新的全局变量).

无论之前是否a存在,表达式仍然返回指定的值1,因此REPL打印出来.