一尘不染

javascript和var关键字中的赋值

node.js

我正在阅读“学习节点”这本书,但陷入了一个非常简单的问题,这个问题我并没有考虑太多:javascript中的赋值。

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

var a = 2
(undefined)

而以下代码将在REPL中返回“ 2”:

a = 2
2

这是为什么?上面的代码不是归因吗?怎么会?如果var’a’直到代码中的那个点才存在,那么为什么它不存在并归因于此?


阅读 255

收藏
2020-07-07

共1个答案

一尘不染

根据ECMA-262第12.2节
VariableStatement (即var identifier=value)明确不返回任何内容。另外, VariableStatement
是一条语句;语句不返回值,并且将Statement放置在Expression所在的位置是无效的。

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

var a = var b;
function fn() { return var x; }

根据第11.13.1节
分配 给变量(identifier=value)会返回分配的值。


在编写时var a = 1;,它声明a并将其值初始化为1。由于这是一个 VariableStatement
,因此不返回任何内容,并且REPL打印undefined

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

无论之前是否a存在,表达式仍会返回分配的值1,因此REPL会打印该值。

2020-07-07