繁体   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