循环(事件)中的闭包问题
Issues with closure in for-loop (event)
下面是一个循环,它创建了六个不同颜色的框。单击框时,变量"color"将更改为框的颜色。代码中有一个明显的问题,那就是闭包(所有的盒子都得到了数组中的最后一个类,而boxColors[i]不可能在事件中使用(未定义)。
如何以优雅的方式解决此问题?提前谢谢。
var boxColors = ['red', 'green', 'blue', 'yellow', 'white', 'black'];
for (var i = 0; i < boxColors.length; i++){
$('<div/>', {
'class': boxColors[i]
}).appendTo(toolboxSection1).click(function(){
color = boxColors[i];
});
}
这个问题的一个例子以及如何在一般情况下解决它,在循环内的JavaScript闭包中进行了描述——这是一个简单的实际例子。
但是,jQuery允许您将额外的数据传递给事件处理程序(请参阅文档),这是解决此问题的另一种方法:
for (var i = 0; i < boxColors.length; i++){
$('<div/>', {
'class': boxColors[i]
})
.appendTo(toolboxSection1)
.click({color: boxColors[i]}, function(event){
// event.data.color
});
}
问题是for循环捕获的是单个变量i
,而不是它们的boxColors.length
计数。解决这个问题的最简单方法是创建一个新函数,该函数将索引作为参数,从而为每次迭代创建一个新i
var action = function(i) {
$('<div/>', {
'class': boxColors[i]
}).appendTo(toolboxSection1).click(function(){
color = boxColors[i];
});
};
for (var index = 0; index < boxColors.length; index++) {
action(index);
}
相关文章:
- JavaScript + mocha:可能是在 for 循环中声明函数的闭包问题
- Javascript;promise中存在Q-闭包问题
- 我在循环中遇到闭包问题,但我仍然使用单独的功能
- 创建带有回调的动态 JSON 数组(内部闭包问题)
- javascript中奇怪的闭包问题
- 简单的Javascript闭包问题
- 如何解决angularjs中的闭包问题
- 数组中jQuery元素的常见JavaScript闭包问题
- 试图理解js中的闭包问题
- 如何通过闭包问题来增加全局变量
- 循环(事件)中的闭包问题
- 不能将事件传递给addEventListener:闭包问题
- 可能是另一个Javascript闭包问题
- JavaScript闭包问题
- 为已发出的事件创建侦听器时的闭包问题
- 关于在循环中创建动态元素的JavaScript闭包问题
- 类定义中的闭包问题
- 微小的JavaScript闭包问题
- Javascript闭包问题
- StateProvider动态生成模板url -闭包问题