【问题标题】:JavaScript function parameter by value [duplicate]JavaScript函数参数按值[重复]
【发布时间】:2014-05-10 19:21:35
【问题描述】:

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

这行得通:

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

但这不起作用:

var temp = ['aaa','bbb'];
var b = [];
for (i=0;i<2;i++)
{
    b[i] = { text: temp[i], onclick: function(){alert(temp[i])}};
}

[0] // 点击时 bbb
[1] // 点击时 bbb

我该如何解决这个问题?

【问题讨论】:

    标签: javascript arrays function object reference


    【解决方案1】:

    啊,可怕的关闭问题又来了。 ) 问题是在循环中定义的函数只是“知道”它应该使用变量 named i(围绕它的“闭包”) - 但它对 i 在它被定义的那一刻。你有没有找过closure issue,你会在 SO 找到很多类似的问题。它们都有一个共同点:在循环中定义了一个函数(作为事件处理程序或超时回调),并且该函数以某种方式处理循环变量(或基于它的某个值)。

    此问题的一个常见解决方案是显式本地化此函数的循环变量。例如:

      b[i] = (function(i) {
        return { text: temp[i], onclick: function(){alert(temp[i])}};
      })(i);
    

    说明:在循环的每个步骤中,您创建并立即调用 (!) 一个将 currenti 作为实际参数的函数。这样,它创建的函数(在本例中为 onclick 处理程序)不再适用于 'closured' i - 而是本地的。

    这 - 将函数定义包装到另一个函数中 - 是此类问题的通用解决方案。但在这种特殊情况下,它可以被优化:

      b[i] = (function(tempVal) {
        return { text: tempVal, onclick: function(){alert(tempVal)}};
      })(temp[i]);
    

    ...因为您在这里只使用temp[i] 值,而单独使用i 不会在任何地方使用。

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 2011-09-23
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多