[英]Mac terminal node REPL output for variable declarations
在Mac(OS X 10.13.3)终端中,当我输入节点(v8.10.0)的REPL并输入以下各行时,我得到指示的输出:
> 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在控制台上显示“未定义””或“ node.js REPL为“未定义””的问题中找不到答案。我也找不到答案在REPL的Node.js v8.10.0文档部分中 。在Google上搜索例如node repl "return value"
等也无济于事。)
前两个( let
和const
)是LexicalDeclaration 。 下一个( var
)是VariableStatement 。 最后一个是AssignmentExpression 。
LexicalDeclaration和VariableStatement没有返回值。 的AssignmentExpression具有。 详细信息如下。
从第三个开始,以var identifier = expression
为例。 这是一个VariableStatement 。 其评估语义在规范中表示如下:
语义
生产VariableStatement :
var
VariableDeclarationList ; 评估如下:
- 评估VariableDeclarationList 。
- 返回(正常, 空 ,空)。
注意表达式的返回为空 。 在分配中不会发生相同的情况(请参阅“ 返回”部分) 。
关于let
和const
声明 ,关于它们的评估 :
13.3.1.4运行时语义:评估
词法声明 : LetOrConst BindingList;
- 接下来让我们得出BindingList的结果。
- ReturnIfAbrupt ( next )。
- 返回NormalCompletion ( 空 )。
同样,空( undefined
)在正常完成时返回。 (例如,在已经声明了变量时会突然发生。)
最后一个是AssignmentExpression 。 它求值(返回)一个值。 例如,采用其最简单的形式Simple Assignment ,评估规范:
生产的AssignmentExpression : LeftHandSideExpression = AssignmentExpression的评估如下:
- 令lref为评估LeftHandSideExpression的结果。
...
- 返回rval 。
注意返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.