0

今日、JavaScript を使用すると、エラーを発生させずにこれを実行できることが (難しい方法で) わかりました。

for(var i = 0; i < 100; ++i){
    /* do some stuff */
    for(var i = 0; i < 200; ++i){
        /* do some more stuff */
    }
}

i誤って両方のループに同じ識別子を使用しました。

JavaScript コンパイラ/インタープリタは (Java のように) エラーを生成せず、外側のループで変数を隠す別の変数を作成しません (C++ のように)。それらは同じ変数を参照するため、外側のループは 1 回だけ実行されます。

これはなぜですか?この動作は、どのような状況でも役に立ちますか?

4

2 に答える 2

0

これには使い道がありません。var i;警告やエラーなしで 2 回実行できるのは、この言語の不完全さのようです。

このコメントで指摘されているように、let代わりに を使用すると、varこの問題が解決します。はvar関数本体の先頭までlet巻き上げられますが、最も近い までしか巻き上げられません{letただし、まだ広くサポートされていないため、古いブラウザーとの互換性を維持する必要がある場合は、まだ使用しないでください。

JSHintなどのコード チェック ツールは、このような重複宣言の問題を検出するのに役立ちます。

于 2016-10-17T07:44:49.253 に答える
0

ご覧のとおり、最初の値は 2 回表示され、最大数までの他のすべての値は 1 回だけ表示されます。

したがって、このパターンを使用してもまったく意味がありません。

再宣言は先頭に移動され、同じ変数に対して 1 回だけ使用されます。

for (var i = 0; i < 10; ++i){
    console.log('outer', i);
    for (var i = 0; i < 20; ++i){
        console.log('inner', i);
    }
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

于 2016-10-16T09:24:43.150 に答える