2015-10-21 8 views
5

私はletがブロックスコープのローカル変数を宣言することを知っていますが、なぜvarのような再宣言と巻上げをサポートしていませんか?なぜ文の動作がvarと大きく異なるのでしょうか?

この制限の目的は何ですか?

(function(){ 
    'use strict'; 
    alert(a);  // undefined 
    var a; 
})(); 

(function(){ 
    'use strict'; 
    alert(a);  // error 
    let a; 
})(); 

(function(){ 
    'use strict'; 
    var a; 
    var a; 
    alert(a);  // undefined 
})(); 

(function(){ 
    'use strict'; 
    let a; 
    let a;   // error 
    alert(a); 
})(); 
+1

@ user2190986しかし、letはJavaScriptで定数を宣言しないことは明らかです。 – Rufus

+0

@ user2190986 constを宣言するために 'const'が使用されています。 – Alastair

+1

'let'宣言は**ホイストされています。しかし、 'var'宣言とは異なり、変数はブロックの始めに' undefined'で初期化されません。 – zeroflagL

答えて

8

アイデアは、より明確な、元varよりも厳密だツールを作成することです。人間として

、次は有効なJavaScriptですが、理解することはほぼ不可能:

alert(a); // Where does a come from? Why does this not throw? 
/* 1000 lines later, or even in an entirely different file */ 
var a; 

また、同じスコープで同じ変数のための5つのvar宣言、if文では、いくつかの、いくつかの中でコードを想像for s。最初は何ですか?どのような価値が創出されるのでしょうか?

bad parts of varの一部を修正することでした。

1

厳しい演算子がどのプログラミング言語にも現れるのと同じ理由 - 足で自分自身を撃つ方法の数を制限します。オールドスクールのJavascriptは、それらの完全なチョックです。

あなたはブロックローカルスコープのためletを使用することができます注:

while (i < 5) 
{ 
    let a = 42; 

    i++; 
} 

ループが数回、aが常に適切に初期化されて実行されるにもかかわらず。

ここで、より高い範囲に別の変数があるとどうなりますか?

let a = 42; 

while (i < 5) 
{ 
    let a = 10; 

    // What is the value of a here? 
    i++; 
} 

// And here? 

ここには多少の曖昧さがあります。あいまいさはプログラミング言語の悪い機能です。これは非ブロックスコープのvarでは問題ではありません。その1つは独自の問題を持ち、人は常にそれを悪用しますが、少なくともvarでないことが明らかです。ブロックスコープです。そして、それでも人々はそれをのように使用して、ブロックスコープのです。

この狂気を修正する唯一の方法は、言語を少し厳しくすることです。これは実際にあなたが何らかの機能を失ったことを意味しましたか?いいえ、可変シャドウイングはvarでは悪い考えでしたが、letではやはり悪い考えです(私の例では悪化する可能性があります)。

これはJavascript固有のものではなく、ロングショットではありません。たとえば、C#の場合:

int i = 0; 

int i = 42; // Compiler error: A local variable named 'i' is already defined in this scope 

なぜですか?あなたが明らかにを持っていたので、が間違っていました。おそらく、別の場所からコードをコピーして、すでにiという別の変数が宣言されていることに気付かなかったでしょう。おそらく、別のループの途中でループ変数としてiを使用していることを忘れていたかもしれません。本物の正当な使用はありませんが、多くの失敗モードがあります。これはひどい言語機能です。単純なコンパイラエラーは、これらの障害のほとんどすべてが発生するのを防ぎます。特に、「内部」ブロックがあまり頻繁に使用されない場合、これらの障害の多くは見つけにくい可能性があります。

関連する問題