我正在阅读“学习节点”这本书,但陷入了一个非常简单的问题,这个问题我并没有考虑太多:javascript中的赋值。
作者指出,我们应该意识到,通过使用Node的REPL,以下内容将返回undefined:
var a = 2 (undefined)
而以下代码将在REPL中返回“ 2”:
a = 2 2
这是为什么?上面的代码不是归因吗?怎么会?如果var’a’直到代码中的那个点才存在,那么为什么它不存在并归因于此?
根据ECMA-262第12.2节, VariableStatement (即var identifier=value)明确不返回任何内容。另外, VariableStatement 是一条语句;语句不返回值,并且将Statement放置在Expression所在的位置是无效的。
var identifier=value
例如,以下任何一项都没有意义,因为它们将一个Statement放置在您需要增值表达式的位置:
var a = var b; function fn() { return var x; }
根据第11.13.1节, 分配 给变量(identifier=value)会返回分配的值。
identifier=value
在编写时var a = 1;,它声明a并将其值初始化为1。由于这是一个 VariableStatement ,因此不返回任何内容,并且REPL打印undefined。
var a = 1;
a
1
undefined
a=1是分配1给的表达式a。由于没有a,JavaScript会在普通代码中隐式创建一个 全局 变量a(但是会ReferenceError在严格模式下抛出,因为您不允许在严格模式下隐式创建新的全局变量)。
a=1
ReferenceError
无论之前是否a存在,表达式仍会返回分配的值1,因此REPL会打印该值。