【发布时间】: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