厳しい演算子がどのプログラミング言語にも現れるのと同じ理由 - 足で自分自身を撃つ方法の数を制限します。オールドスクールの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
を使用していることを忘れていたかもしれません。本物の正当な使用はありませんが、多くの失敗モードがあります。これはひどい言語機能です。単純なコンパイラエラーは、これらの障害のほとんどすべてが発生するのを防ぎます。特に、「内部」ブロックがあまり頻繁に使用されない場合、これらの障害の多くは見つけにくい可能性があります。
@ user2190986しかし、letはJavaScriptで定数を宣言しないことは明らかです。 – Rufus
@ user2190986 constを宣言するために 'const'が使用されています。 – Alastair
'let'宣言は**ホイストされています。しかし、 'var'宣言とは異なり、変数はブロックの始めに' undefined'で初期化されません。 – zeroflagL