65

JavaScript 変数のスコープに関する簡単な質問です。

関数が を返す代わりにalert()の値を出力するのはなぜですか?iundefined

$(document).ready(function () {
    for(var i = 0; i < 10; i += 1){
    }

     alert("What is 'i'? " + i);
});

私はJSにかなり慣れていませんが、私が手を出した他のほとんどすべての言語では、forループのスコープ内の宣言には、そのループの値が含まれますが、この場合はそうではありません。なぜですか?

つまりWhat is 'i'? 10'、印刷されます。

4

5 に答える 5

16

JavaScript の関係者はこれを修正しようとしています。

EcmaScript6 (別名 EcmaScript 2015) は、昨年の夏に渡された JavaScript の最新バージョンであり、ブラウザーはその機能をサポートし始めたばかりです。

これらの機能の 1 つは、"let" 式を使用したブロック スコープのローカル変数です。現在 (2016 年 4 月) の時点で、Safari を除く主要なブラウザの現在のバージョンのほとんどがこれをサポートしています。これをサポートするモバイル ブラウザーはほとんどありません。

詳細については、こちらを参照してください (特に、「for ループ内の let スコープの変数」セクションを参照してください): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

ここで現在のブラウザー サポートを確認できます (行 Bindings -> let を探します): https://kangax.github.io/compat-table/es6/

于 2016-04-13T18:58:00.563 に答える
10

他の言語 (Java、C++、C など) とは異なり、JavaScript はブロック スコープをサポートしていません。ループまたは関数で変数を宣言すると、スコープは関数本体内になります。

for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

ここで youriはグローバル変数にjなり、ループがある関数またはスクリプトに対してローカルになります。

于 2014-10-01T06:16:24.587 に答える
9
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

上記がグローバル変数を作成すると述べるのは正しくありませんi。常にvar変数を宣言するために使用する必要があると思います(意図的に「変数」ではなく「プロパティ」が必要な場合を除きます-これは、99.99%のJSコーディングシナリオではほとんどありません...)

var初期値を に代入するときに省略iすると、ローカル変数またはグローバル変数が作成iされず、グローバル オブジェクトのプロパティが作成されます (グローバル変数のように見えたり動作したりする場合がありますが、微妙な違いがいくつかあります)。

より良いでしょう:

var i;
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

現在、ループはグローバル変数(または、このコードが関数内にある場合はi関数ローカル変数) を使用しています。i

これについては、var キーワードの機能変数と Javascript のプロパティで詳細を参照してください。

-- 注: 少し混乱するのは、たとえば 2 番目のループで変数を再宣言できることです。

for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}


for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}

これは有効なようです(テストしてもエラーはありません)。JavaScript で変数を再宣言できるようですが、特別な場合を除いて、すべてが良い考えであるとは限りません。[Google アナリティクスが変数の「安全な」再宣言をどのように利用するかについて言及しているこの関連する質問を参照してください] ( JavaScript 変数の再宣言)

iこの関連する SO の質問では、JS での変数の再宣言 (および のようなループ変数) についていくつかの議論があります:ループ内またはループ外で変数を宣言する

変数の単一宣言の JavaScript パターンのイベントがあります。

于 2014-10-21T15:59:29.173 に答える