簡體   English   中英

為什么當for循環為3時JavaScript始終向4發出警報?

[英]Why JavaScript alerts allways 4 in when for-loop is for 3?

為什么此JavaScript在for循環為3時始終向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) });
}

當循環結束時,表示i >3 ,要在函數調用中保留特定數字,請使用閉包:

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

for循環將一直持續到laCount == 4 (最后一次執行循環時,該值為3,然后將其遞增為4,以使循環測試失敗)。 因此,在for循環之后該值為4。

因為當您單擊元素時; 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);
}

您沒有在循環中立即調用reOrderLayers ,而是構造了一個函數文字。 文字將有一個閉包,它引用環境中的laCount變量,當最終觸發click事件時,該變量將為4。

因為:

var c = 0;
for(c = 1; c <= 3; c++) {};
alert(c); // alerts 4.

在前3次迭代中, for循環進入主體並執行內部的代碼。 一旦您進行了第4次迭代, lacount就會增加,並且條件失敗,因此您不必再次進入循環。

如果出於某種原因需要lacount3 ,則可以嘗試將初始for循環條件設置為i < 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM