2016-06-28 6 views
-1

私はこのサイトでかなり新しいです。ループ内でXMLHttpRequest関数を呼び出すためにここでクロージャが必要なのはなぜですか?

function changeForm(i) { 
    if (selection[i-1] != 0) { 
     xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = function() { 
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
       document.getElementById("box"+i).innerHTML = xmlhttp.responseText; 
      } 
     }; 
     xmlhttp.open("POST", "fetchLineChoice_addData.php", true); 
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
     xmlhttp.send("index="+i+"&lc="+selection[i-1]); 
    } else { 
     document.getElementById("box"+i).innerHTML = ""; 
    } 
} 

for (var i = 1 ; i < 4 ; i++) { 
    changeForm(i); 
} 

for (var i = 1 ; i < 4 ; i++) { 
    if (selection[i-1] != 0) { 
     xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
       document.getElementById("box"+i).innerHTML = xmlhttp.responseText; 
      } 
     }; 
     xmlhttp.open("POST", "fetchLineChoice_addData.php", true); 
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
     xmlhttp.send("index="+i+"&lc="+selection[i-1]); 
    } else { 
     document.getElementById("box"+i).innerHTML = ""; 
    } 
} 

を、私は次の2つのコードブロック間の違いを理解していない:私は次のようにループのために複製されるのXMLHttpRequestで作業するときに質問があります

私は本当に最初のものがなぜ機能するのか分かりませんが、2番目のものはなぜか分かりません。私は閉鎖についてネットで検索しようとしましたが、これらの2を思い付いています

Calling a XMLHttpRequest continuously

JavaScript closure inside loops – simple practical example

2番目の質問から、関数が変数にバインドされていることを述べました。 iはこの機能の外にあります。 2番目のコードブロック(動作しません)を知りたいのですが、の値がになる前にforループの内容が完全に実行されない理由を知りたいのですが? 2つのコードブロックが実行されているときのフローは何ですか?

ありがとうございました!

+0

この問題の詳細については、リンク先の2番目の質問で詳しく説明しています。それは正確に何の説明から理解していないのですか? * "問題は、各無名関数内の変数iが関数外の同じ変数に束縛されていることです。" *すべてのコールバックは、作成しなければ同じ 'i'を使います各反復のための別々のスコープは、それぞれがそれ自身の 'i'を持つようにします。 –

+0

実際、私は、反復されている関数の中で変数の範囲の概念と全く混同しています。だから、ループ内のコードブロックが実行されますが、iの値はプロセス全体を完了することなく、独立して変更されますか? –

+0

コールバックは非同期ですが、後で発生します。それが起こるまでに、ループは終了し、「i」は最終値になります。 –

答えて

1

"i"の値が上書きされないため、最初のものが機能します。それは「閉鎖され」、実行中は同じままです。

2番目の例では、反復処理によってXMLHttpRequestが生成されますが、グローバル値 "i"が変更されます。要求が完了するまでには、もはやあなたが期待している "i"の値を指していません。

関連する問題