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

时间:2018-03-24 22:41:36

标签: javascript node.js undefined read-eval-print-loop variable-declaration

在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 = 1x = 1会产生不同的变量范围,但我怀疑这不是问题所在。

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

(我试图搜索StackOverflow,但在题为'node.js displays “undefined” on the console''node.js REPL “undefined” '的问题中找不到答案。我也找不到{{3}的答案例如,在Google上搜索node repl "return value"等也无济于事。)

1 个答案:

答案 0 :(得分:2)

TL;博士

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

LexicalDeclaration VariableStatement 没有返回值。 AssignmentExpression 有。详情如下。


详细

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

  

语义

     

生产 VariableStatement var VariableDeclarationList ;是   评估如下:

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

注意表达式返回中的。在assignments (see the Return part)中也不会发生同样的情况。

关于let and const declarations,关于their evaluation

  

13.3.1.4运行时语义:评估

     

LexicalDeclaration LetOrConst BindingList;

     
      
  1. 接下来是评估 BindingList
  2. 的结果   
  3. ReturnIfAbrupt)。
  4.   
  5. 返回NormalCompletion )。
  6.   

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


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

  

生产 AssignmentExpression LeftHandSideExpression =    AssignmentExpression 评估,如下所示:

     
      
    1.   
    2. lref 成为评估 LeftHandSideExpression 的结果。
      ...
    3.   
  •   
    1.   
    2. 返回 rval
    3.   
  •   

注意返回值。