[英]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.