簡體   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