6

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

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

var a = 2
(undefined)

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

a = 2
2

这是为什么?上面的代码不是属性吗?怎么来的?如果 var 'a' 直到代码中的那个点才存在,为什么它不存在和归属?

4

4 回答 4

7

根据ECMA-262 § 12.2VariableStatement(即var identifier=value)显式地不返回任何内容。此外,VariableStatement是一个语句;语句不返回值,并且将语句放在表达式所在的位置是无效的。

例如,以下所有内容都没有任何意义,因为它们将 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变量(但会在严格模式下抛出 a ReferenceError,因为您不允许在严格模式下隐式创建新的全局变量)。

不管之前是否a存在,表达式仍然返回分配的值,,1所以 REPL 打印出来。

于 2012-11-01T16:03:25.190 回答
1

Just guessing here - this could probably be verified by referring to the ECMAScript 5th Edition spec (but man that thing is a pain) - it probably has to do with the specification of the "var" statement vs assigning attributes to the "global" object.

When you declare a variable and assign a value to it (var a=2) the returned value is likely "undefined" because that's what the spec says the "var" statement should return.

When you assign a variable to a symbol without using the "var" statement you are actually assigning a value to an attribute of the global object of that name. That is, a=2 is the same as saying window.a=2 and we know that assinging a value to an attribute returns the value assigned.

于 2012-11-01T15:33:38.483 回答
1

var a = 2 is a statement. Thus it has no value.

于 2012-11-01T15:34:14.327 回答
1

您正在评估一份声明清单。在评估语句列表时,返回最后一个产生值的语句的值。http://ecma-international.org/ecma-262/5.1/#sec-12.1 - 请注意本节末尾的示例。如果列表中没有任何语句返回值,则不会返回任何内容(这是undefined在 JavaScript 中)。

变量语句,不返回值。http://ecma-international.org/ecma-262/5.1/#sec-12.2

赋值运算符确实返回一个值(以及执行赋值)。http://ecma-international.org/ecma-262/5.1/#sec-11.13.1

于 2012-11-01T16:02:14.257 回答