为什么JavaScript在for循环为3时向所有4发出警报

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

本文关键字:4发 3时 JavaScript for 循环 为什么      更新时间:2023-09-26

为什么当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) });
}

当循环结束时,意味着i>3,为了在函数调用中保留特定的数字,请使用闭包:

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

for循环一直持续到laCount == 4(上次执行循环时,值为3,然后递增到4,因此循环测试失败)。因此,for循环之后的值为4。

您没有在循环中立即调用reOrderLayers,而是构造了一个函数文本。文字将有一个闭包,它引用环境中的laCount变量,当单击事件最终触发时,该变量将为4。

因为当您单击元素时;for循环已经完成,laCount的当前值将为4;

您应该创建一个上下文来为每个层保存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);
}

因为:

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

在前3次迭代中,for循环进入主体并执行内部代码。一旦您进行了第4次迭代,lacount就会递增,并且条件失败,因此您不会再次进入循环。

如果出于某种原因需要lacount3,可以尝试将循环条件的初始值设置为i < 3