私はこのサイトでかなり新しいです。ループ内で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つのコードブロックが実行されているときのフローは何ですか?
ありがとうございました!
この問題の詳細については、リンク先の2番目の質問で詳しく説明しています。それは正確に何の説明から理解していないのですか? * "問題は、各無名関数内の変数iが関数外の同じ変数に束縛されていることです。" *すべてのコールバックは、作成しなければ同じ 'i'を使います各反復のための別々のスコープは、それぞれがそれ自身の 'i'を持つようにします。 –
実際、私は、反復されている関数の中で変数の範囲の概念と全く混同しています。だから、ループ内のコードブロックが実行されますが、iの値はプロセス全体を完了することなく、独立して変更されますか? –
コールバックは非同期ですが、後で発生します。それが起こるまでに、ループは終了し、「i」は最終値になります。 –