在价值和参考方面存在一些问题
这有效:
var temp = ['aaa','bbb'];
var b = [];
b[1] = { text: temp[1], onclick: function(){alert(temp[1])}}; // aaa on clock
b[0] = { text: temp[0], onclick: function(){alert(temp[0])}}; // bbb on clock
[0] // aaa点击
[1] // bbb on click
但这不起作用:
var temp = ['aaa','bbb'];
var b = [];
for (i=0;i<2;i++)
{
b[i] = { text: temp[i], onclick: function(){alert(temp[i])}};
}
[0] // bbb on click
[1] // bbb on click
我该如何解决这个问题?
答案 0 :(得分:3)
i
(围绕它的'闭合') - 但它不知道任何关于i
的{em>值在定义的那一刻。您是否找过closure issue
,您在SO处发现了许多类似的问题。它们都有一个共同点:在循环中定义了一个函数(作为事件处理程序或超时回调),并且该函数以某种方式处理循环变量(或基于它的某个值)。
此问题的一个常见解决方案是显式本地化此函数的循环变量。例如:
b[i] = (function(i) {
return { text: temp[i], onclick: function(){alert(temp[i])}};
})(i);
说明:在循环的每一步中,您创建并立即调用(!)一个函数,将当前值i
作为实际参数。这样,它创建的函数(在此示例中为onclick
处理程序)不再适用于'封闭'i
- 而是本地函数。
这 - 将函数定义包装到另一个函数中 - 是此类问题的通用解决方案。但在这种特殊情况下,它可以进行优化:
b[i] = (function(tempVal) {
return { text: tempVal, onclick: function(){alert(tempVal)}};
})(temp[i]);
...因为您在这里仅使用temp[i]
值,并且单独使用i
并未在任何地方使用。