我正在读“学习节点”这本书,我陷入了一个非常简单的问题,一个我没有过多思考的问题: javascript中的作业。
作者指出,我们应该意识到,通过使用Node的REPL,将返回以下未定义的内容:
var a = 2
(undefined)而下面的代码将在REPL中返回'2‘:
a = 2
2为什么会这样呢?上面的代码不是属性吗?怎么会这样?如果var 'a‘直到代码中的这一点都不存在,为什么它不存在呢?
发布于 2012-11-02 00:03:25
对于每个ECMA-262 § 12.2,VariableStatement (即var identifier=value)显式返回任何内容。此外,VariableStatement是一条语句;语句不返回值,并且将语句放在表达式要到达的位置是无效的。
例如,以下这些语句都没有意义,因为它们将语句放在需要产生值的表达式的位置:
var a = var b;
function fn() { return var x; }对于每个变量,assignment to a § 11.13.1 (identifier=value)返回赋值的值。
当您编写var a = 1;时,它会声明a并将其值初始化为1。因为这是一个VariableStatement,所以它不返回任何内容,并且REPL打印undefined。
a=1是将1赋值给a的表达式。因为没有a,所以JavaScript会在普通代码中隐式地创建一个全局a (但是会在严格模式下抛出一个ReferenceError,因为您不能在严格模式下隐式创建新的全局变量)。
无论以前是否存在a,表达式仍然会返回赋值1,因此REPL会打印该值。
发布于 2012-11-01 23:33:38
在这里只是猜测-这可能可以通过参考ECMAScript第5版规范来验证(但天哪,这件事很麻烦)-这可能与"var“语句的规范与为”全局“对象分配属性有关。
当您声明一个变量并为其赋值(var a=2)时,返回的值可能是“未定义的”,因为规范规定"var“语句应该返回该值。
当您不使用"var“语句将变量赋给一个符号时,您实际上是在为具有该名称的全局对象的属性赋值。也就是说,a=2等同于window.a=2,我们知道为属性赋值会返回赋值的值。
发布于 2012-11-01 23:34:14
var a = 2是一条语句。因此,它没有价值。
https://stackoverflow.com/questions/13180195
复制相似问题