【问题标题】:Function inside loop closure issue闭环问题内的函数
【发布时间】:2018-01-02 23:03:19
【问题描述】:

我真的很难理解闭包。我只是写了一个小函数来尝试在数组索引中存储多个函数,但是当我打印出来时它们是未定义的。

这是我的代码:

function x() {

    var arr = [];

    for(var i = 0; i < 5; i++) {
        arr.push( (function(index) { console.log(index) } )(i) );
    }

    return arr;
}

var z = new x();

for (var j = 0; j < 5; j++) {
    console.log(z[j]); // Reads Undefined?
}

据我所知,我正在使用 IIFE 并传入“i”并将其用作“索引”,这应该让我解决已知的关闭范围问题,即不断打印最后一个索引。但是为什么我的数组索引未定义并且没有打印出'i'?

我们将不胜感激。谢谢。

【问题讨论】:

  • 您的 IIFE 不返回任何内容,这意味着它隐式返回 undefined。因此,您将 undefined 推入数组五次,导致您看到的结果。尝试从该函数返回索引,例如:console.log(index); return index;
  • 傻我 :) 谢谢
  • 希望您会看到 IIFE 函数对于将索引推送到数组是不必要的。只有在推送需要保持对当前索引的引用的函数时,它才会有用。

标签: javascript closures


【解决方案1】:

您不会从 IIFE 返回任何内容,因此它会隐式返回 undefined,它会附加到数组中。如果你想存储index 的值,你需要返回它:

arr.push( (function(index) { console.log(index); return index; } )(i) );

【讨论】:

  • 哦,我明白了。谢谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多