为什么JavaScript在for循环为3时向所有4发出警报
Why JavaScript alerts allways 4 in when for-loop is for 3?
为什么当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
就会递增,并且条件失败,因此您不会再次进入循环。
如果出于某种原因需要lacount
为3
,可以尝试将循环条件的初始值设置为i < 3
。
相关文章:
- 在mvc应用程序中,在回发时保留最初隐藏的文本框的隐藏或可见状态
- 回发时回显值
- 在点击AngularJS时发出新的AJAX请求
- Gridview内部的下拉框在回发时未保留背景色
- 回发时mantan项的值
- 在iPad上按回车键时停止回发
- 当页面回发ASP.NET时,时间选择器javascript将停止工作
- 浏览器在使用CORS XHR时不会发回cookie
- Javascript计时器在每次回发时进行初始化
- 回发后第一次单击按钮时,OnClientClick未触发
- 使用asp.net和母版页在ListView中保持回发时的滚动位置
- 在旧版本的 Firefox 中回发页面时,未在下拉列表中选择值
- 为什么回发时控件消失
- 文本框在回发时变为只读,即使手动将只读属性设置为 false
- 如何在涉及回发时从代码隐藏将焦点设置为文本框
- 单击按钮时的 Javascript 条件回发
- 由 javascript 更改时回发时丢失的值
- Javascript 在每个回发时都会生成逗号
- 避免在回发页面时出现 Javascript 错误
- DIV只是在发回时显示