JavaScript函数参数值

时间:2014-03-31 12:41:55

标签: javascript arrays function object reference

在价值和参考方面存在一些问题

这有效:

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

我该如何解决这个问题?

1 个答案:

答案 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并未在任何地方使用。