在Mac(OS X 10.13.3)终端中,当我输入节点的REPL(v8.10.0)并输入以下各行时,我得到指示的输出:
> let a = 'abc'
undefined
> const b = 'abc'
undefined
> var c = 'abc'
undefined
> d = 'abc'
'abc'
为什么前三个与上一个之间的输出差异?
据我所知,在ES5非严格模式下,var x = 1
和x = 1
会产生不同的变量范围,但我怀疑这不是问题所在。
我也理解d = 'abc'
不再是JavaScript的最佳实践,甚至不允许使用ES5严格模式。但是,我只是想了解行之间的语法差异和/或节点REPL如何解释输入。这是否与语句与表达式(或定义或赋值或声明或......)有关?
(我试图搜索StackOverflow,但在题为'node.js displays “undefined” on the console'或'node.js REPL “undefined”
'的问题中找不到答案。我也找不到{{3}的答案例如,在Google上搜索node repl "return value"
等也无济于事。)
答案 0 :(得分:2)
前两个(let
和const
)是LexicalDeclaration。下一个(var
)是VariableStatement。最后一个是AssignmentExpression。
LexicalDeclaration 和 VariableStatement 没有返回值。 AssignmentExpression 有。详情如下。
从第三个开始,例如,取var identifier = expression
。这是一个VariableStatement。其评估语义在规范中表示如下:
语义
生产 VariableStatement :
var
VariableDeclarationList ;是 评估如下:
- 评估 VariableDeclarationList 。
- 返回(正常,空,空)。
醇>
注意表达式返回中的空。在assignments (see the Return part)中也不会发生同样的情况。
关于let
and const
declarations,关于their evaluation:
13.3.1.4运行时语义:评估
LexicalDeclaration : LetOrConst BindingList;
- 接下来是评估 BindingList 。
的结果- ReturnIfAbrupt(下)。
- 返回NormalCompletion( 空 )。
醇>
同样,空(undefined
)在正常完成时返回。 (例如,当变量已经被声明时,就会突然发生。)
最后一个是AssignmentExpression。它评估(返回)一个值。例如,采用最简单的形式Simple Assignment,评估规范:
生产 AssignmentExpression : LeftHandSideExpression = AssignmentExpression 评估,如下所示:
- 让 lref 成为评估 LeftHandSideExpression 的结果。
...
- 返回 rval 。
注意返回值。