繁体   English   中英

Mac终端节点REPL输出,用于变量声明

[英]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 = 1x = 1导致不同的变量范围,但是我怀疑这不是这里的问题。

我还了解到d = 'abc'不再是JavaScript的最佳实践,甚至在ES5严格模式下甚至都不被允许。 但是,我只是想了解行之间的语法差异和/或节点REPL如何解释输入。 这与语句和表达式(或定义或赋值或声明或...)有关吗?

(我曾尝试搜索StackOverflow,但在名为“ node.js在控制台上显示“未定义””“ node.js REPL为“未定义””的问题中找不到答案。我也找不到答案在REPLNode.js v8.10.0文档部分中 。在Google上搜索例如node repl "return value"等也无济于事。)

TL;博士

前两个( letconst )是LexicalDeclaration 下一个( var )是VariableStatement 最后一个是AssignmentExpression

LexicalDeclarationVariableStatement没有返回值。 的AssignmentExpression具有。 详细信息如下。


细节

从第三个开始,以var identifier = expression为例。 这是一个VariableStatement 其评估语义在规范中表示如下:

语义

生产VariableStatementvar VariableDeclarationList ; 评估如下:

  1. 评估VariableDeclarationList
  2. 返回(正常, ,空)。

注意表达式的返回为 分配中不会发生相同的情况(请参阅“ 返回”部分)

关于letconst声明 ,关于它们的评估

13.3.1.4运行时语义:评估

词法声明LetOrConst BindingList;

  1. 接下来让我们得出BindingList的结果。
  2. ReturnIfAbruptnext )。
  3. 返回NormalCompletion )。

同样,空( undefined )在正常完成时返回。 (例如,在已经声明了变量时会突然发生。)


最后一个是AssignmentExpression 值(返回)一个值。 例如,采用其最简单的形式Simple Assignment ,评估规范:

生产的AssignmentExpressionLeftHandSideExpression = AssignmentExpression评估如下:

    1. lref为评估LeftHandSideExpression的结果。
      ...
    1. 返回rval

注意返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM