2017-05-31 11 views
7

Zastanawiam się, jakie stany są przechowywane między dwoma wierszami kodu JavaScript przesłanymi do babel-node. Moje zamieszanie powstaje, ponieważ jeśli napiszesz dwa wiersze kodu, możesz zastąpić definicję zmiennej bez błędu. Na przykład, z babel-node --presets es2015, można zrobić:Jaki stan jest przechowywany między wierszami JavaScript?

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

Teraz jeśli napiszesz go w jednej linii, pojawi się błąd:

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

Wydaje się, że w pierwszym przypadku, państwo, które a jest zdefiniowany jako utracony (ale nie do drugiego przypisania), podczas gdy w drugim przypadku jest utrzymywany.

Co powoduje różnice tutaj? i które państwa są utrzymywane?

Odpowiedz

6

Ponieważ const i let są nowe składnie, muszą zostać przeniesiony do jedynego wiążącego mechanizmu, który był dostępny przed ES6: var. W takim przypadku var umożliwia wszelkiego rodzaju przypadkowe przeniesienie bez generowania jakiegokolwiek ostrzeżenia.

Po wpisaniu wyrażenia w babel-node babel transplikuje je, ocenia je, a następnie wyświetla wynik. Babel może sprawdzić niewłaściwe użycie wiązania const w czasie transpozycji, dlatego widzisz błąd dla const a = 1; let a = 2. Ale const a = 1 i let a = 2, gdy transpiled/ocenione jako oddzielne wyrażenia, nie będzie wykazywał błąd, ponieważ babel nie jest w stanie wykryć problemu w żadnym z tych samych wyrażeń.


Bardziej wizualna demonstracja numerze: Dla każdego wyrażenia expr wpisanym w babel-node REPL, to jest w zasadzie to, co się dzieje

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

więc nie będzie widać błąd tutaj

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 

Ale pojawi się tutaj błąd

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

nie używam babel-repl, ale to musi być coś zrobić z konwersją to robi, bo wszystko działa zgodnie z oczekiwaniami z regularną 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

Na miejscu z '' babel-węzeł' będącym konkretnym winowajcą - "replica" węzła wanilii nie wykazuje tego problemu. – naomik

Powiązane problemy