【问题标题】:Mac terminal node REPL output for variable declarations用于变量声明的 Mac 终端节点 REPL 输出
【发布时间】:2018-09-03 08:57:45
【问题描述】:

在 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” ' 的问题中没有找到答案。我也无法在 Node.js v8.10.0 Documentation section for REPL 中找到答案。搜索 Google ,比如说node repl "return value"等也没有帮助。)

【问题讨论】:

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


【解决方案1】:

tl;博士

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

LexicalDeclarations 和 VariableStatements 没有返回值。 AssignmentExpression 有。详情如下。


详情

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

语义

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

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

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

关于let and const declarations,关于their evaluation

13.3.1.4 运行时语义:评估

LexicalDeclaration : LetOrConst BindingList ;

  1. 让 next 成为评估 BindingList 的结果。
  2. ReturnIfAbrupt(下一个)。
  3. 返回NormalCompletion()。

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


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

产生 AssignmentExpression : LeftHandSideExpression = AssignmentExpression 评估如下:

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

注意返回值。

【讨论】:

  • 事实上语句 do 有结果值,通常打印在控制台上 - 但变量声明确实有 undefined 结果。
  • 这并不能解释为什么for (let i=0; i<1; i++) "hello";确实在控制台上打印一些东西——它仍然是一个声明。
  • 嗯,是的,ExpressionStatementifwhile 等其他语句确实有返回值。但是VariableDeclarationLists 没有。 (确切地说,他们返回undefined,众所周知。)
  • @Bergi 我已经用规范中的更具体的术语替换了我使用的术语。不知道我杀死了多少答案的可读性,但至少我希望它现在不那么模棱两可了......
  • 感谢您的努力/专业知识。你的 tl;dr 很有帮助。虽然规范信息有点超出我的想象,但我可以看到 var VariableStatement 和 let/const LexicalDeclarations 每个都返回包含 empty 的内容(可能导致 undefined),而 AssignmentExpression返回一个非empty 值,特别是rval(来自GetValue(rref)...只是为了向您展示我试图点击链接!)。以下是否正确:x = 1 是赋值表达式,也是语句(与 42 相同)但不是声明?
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2011-07-24
  • 2014-12-07
相关资源
最近更新 更多