2

forループが3の場合、なぜこのJavaScriptは常に4でアラートを出すのですか?

// alert
function reOrderLayers(layerToaAlter) {
alert(layerToaAlter);
}

// prepare
var laCount;
for (laCount = 1; laCount <= 3; laCount++) {
    var la = document.getElementById("layerChanger"+laCount);
    la.addEventListener("click", function () { reOrderLayers(laCount) });
}
4

6 に答える 6

3

ループが終了するiと、は>3、関数呼び出しで特定の番号を保持するために、クロージャを使用します。

  la.addEventListener("click", (function(count) { return function () { reOrderLayers(count) } })(laCount)  );
于 2012-09-13T20:33:46.560 に答える
2

forループはまで続きますlaCount == 4(最後にループが実行されたとき、値は3で、その後4にインクリメントされて、ループテストが失敗します)。したがって、forループの後の値は4です。

于 2012-09-13T20:31:24.250 に答える
1

reOrderLayersループ内ですぐに呼び出すのではなく、関数リテラルを作成しました。リテラルにはクロージャがありlaCount、クリックイベントが最終的に発生したときに4になる環境内の変数を参照します。

于 2012-09-13T20:32:21.287 に答える
1

要素をクリックすると; for ループは既に終了しており、laCount の現在の値は 4 になります。

各layerChangerのlaCountを保存するためのコンテキストを作成する必要があります:

function reOrderLayers(layerToaAlter) {
   alert(layerToaAlter);
}
function context(la, laCount){

         la.addEventListener("click", function () { reOrderLayers(laCount) });
  }

// prepare
var laCount, la;
for (laCount = 1; laCount <= 3; laCount++) {
    la = document.getElementById("layerChanger"+laCount);
    context(la, laCount);
}
于 2012-09-13T20:30:40.370 に答える
0

なぜなら:

var c = 0;
for(c = 1; c <= 3; c++) {};
alert(c); // alerts 4.
于 2012-09-13T20:31:44.560 に答える
0

最初の3回の反復では、forループが本体に入り、内部にあるコードを実行します。4回目の反復にlacount入ると、インクリメントされて条件が失敗するため、ループに再び入ることはありません。

何らかの理由で必要な場合はlacount、初期のforループ条件をに設定してみてください。3i < 3

于 2012-09-13T20:32:18.267 に答える