2017-05-31 47 views
7

我想知道在提交到babel-node的兩行JavaScript代碼之間保留了什麼狀態。因爲如果你編寫了兩行代碼,你就可以覆蓋變量定義而不會出錯。例如,對於babel-node --presets es2015,你可以這樣做:JavaScript行之間保持着什麼狀態?

> const a = 1; 
undefined 
> let a = 2; 
undefined 

現在,如果你把它寫在一行,你會得到一個錯誤:

> const a = 1; let a = 2; 
TypeError: repl: Duplicate declaration "a" 
... 

看來,在第一種情況下,該狀態a被定義爲1const變量賦值)丟失(直到第二次賦值),而在第二種情況下,它被保留。

這是什麼原因引起的差異?並維護哪些國家?

回答

6

因爲constlet是新的語法,他們必須被轉譯爲ES6之前可用的唯一綁定機制:var。在這種情況下,var允許各種偶然的重新分配而不會產生任何警告。

所以當你在babel-node中輸入一個表達式時,babel會對它進行轉換,評估它,然後顯示結果。 Babel可以在transpile時間檢查const綁定的濫用情況,這就是爲什麼你會看到const a = 1; let a = 2的錯誤。但是當編譯/評估爲單獨的表達式時,const a = 1let a = 2不會顯示錯誤,因爲babel無法單獨檢測任一表達式中的問題。


問題的更直觀的演示:對於每一個表情expr您在babel-node REPL類型,這基本上是發生了什麼事

evaluate(transpile(expr)) 
// => someResult 

所以你不會在這裏看到一個錯誤

evaluate(transpile('const a = 1')) 
evaluate('var a = 1') 
// bind a to 1 
// return undefined 

evaluate(transpile('let a = 2')) 
evaluate('var a = 2') 
// bind a to 2 
// return undefined 

但是你會在這裏看到一個錯誤

evaluate(transpile('const a = 1; let a = 2')) 
// ERROR during transpile: const a has already been declared 
2

我不使用babel-repl,但它必須是與它做,因爲一切都按預期工作與常規REPL轉換:

$ node -v 
v7.4.0 

$ node 
> const a = 1; 
undefined 
> let a = 1; 
SyntaxError: Identifier 'a' has already been declared 

> const b = 1; let b = 1; 
const b = 1; let b = 1; 
        ^
SyntaxError: Identifier 'b' has already been declared 

> .editor 
// Entering editor mode (^D to finish, ^C to cancel) 
const c = 1; 
let c = 1; 

let c = 1; 
     ^
SyntaxError: Identifier 'c' has already been declared 
+1

現在,'babel-node'成爲特定的罪魁禍首 - 香草'節點'repl沒有出現這個問題。 – naomik

相關問題