2

为什么这个 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) });
}
4

6 回答 6

3

当循环完成意味着iis >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

因为当你点击元素时;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 回答
1

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

于 2012-09-13T20:32:21.287 回答
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就会增加并且条件失败,这样你就不会再次进入循环。

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

于 2012-09-13T20:32:18.267 回答