2017-05-31 17 views
7

babel-node'a gönderilen iki satırlık JavaScript kodu arasında hangi durumların tutulduğunu merak ediyordum. Benim karışıklığım ortaya çıkar, çünkü iki kod satırı yazarsanız, bir değişken tanımını hata olmadan geçersiz kılabilirsiniz. Örneğin, babel-node --presets es2015 ile bunu yapabilirsiniz:JavaScript çizgileri arasında hangi durum tutuluyor?

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

Şimdi tek satırda bunu yazarsanız bir hata alıyorum:

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

Öyle görünüyor ki birinci durumda, devlet a o 1 (const değişken ataması) olarak tanımlanır (ikinci atama kadar), ikinci durumda iken, korunur.

Buradaki farklılıklara ne sebep olur? ve hangi devletler korunur?

cevap

6

const Çünkü ve let, onlar gerekir ES6: var'dan önce mevcut olan tek bağlama mekanizmasına aktarılmalıdır. Bu durumda, var, herhangi bir uyarı oluşturmadan her türlü gelişigüzel yeniden tahsis edilmesine izin verir.

babel-node'da bir ifade yazdığınızda, babel iletir, değerlendirir ve sonucu görüntüler. Babil, const ciltleme işleminin aktarım zamanında kötüye kullanıldığını kontrol edebilir, bu nedenle const a = 1; let a = 2 hatası görüyorsunuz. Ancak, const a = 1 ve let a = 2, ayrı ifadeler olarak nakledildiğinde/değerlendirildiğinde, hata göstermeyecektir, çünkü babel her iki ifadede de bir sorunu algılayamaz.


konunun bir daha görsel gösteri: Eğer babel-node Çoğaltma yazdığınız her ifadenin expr için, bu yüzden burada bir hata

görmez

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

oluyor aslında ne

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 

Ancak bir hata göreceksiniz

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

Ben babel-repl kullanmayın, ama her şey normal repl ile beklendiği gibi çalıştığını çünkü yapıyor dönüşüm ile ilgili bir şey olmalı: Yeni sözdizimleri

$ 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' ile belirli bir suçlu olmak - vanilya 'düğüm' repl bu sorunu sergilemez. – naomik

İlgili konular