鉴于此函数调用:
var funcs = obj.getClosures([2, 4, 6, 8], function(x) {
return x*x;
});
我有以下功能:
getClosures : function(arr, fn) {
var funcs = [];
var array = arr;
var i = 0;
var l = array.length;
(function(i, array) {
for (; i < l; i++) {
funcs[i] = function(i, array) {
return fn(array[i]);
};
}
}(i, array));
return funcs;
},
我希望能够遍历返回的数组并获取数组中每个项目的平方根值,就像这样:
for (var i = 0; i < arr.length; i++) {
funcs[i]();
}
每次循环的结果:4, 16, 36, 64
我的 funcs 数组不应该在每个索引中都有一个可以很容易地用相关参数值调用的函数引用吗?我哪里出错了?
最佳答案
有多个“问题”:
IIFE (function(i, array) { ... }(i, array));
在这里没有任何好处。如果删除它,代码将具有完全相同的行为。如果您想捕获 i
和 array
的当前值,您必须将它移动到 inside for
循环。
您的函数定义不正确。
funcs[i] = function(i, array) {
return fn(array[i]);
};
在函数内部,array[i]
将引用您传递给函数的参数。如果您不传递任何参数,它们将是 undefined
并且代码将抛出错误。也就是说,根据该定义,您必须像这样执行函数:
for (var i = 0; i < arr.length; i++) {
funcs[i](i, array);
}
这首先违背了生成函数的目的。
如果你想创建一个可以访问函数定义范围内的 i
和 array
的闭包,不要定义同名参数.
可能的解决方案:
for (var i = 0, l = array.length; i < l; i++) {
(function(i) {
funcs[i] = function() {
return fn(array[i]);
};
}(i));
}
或者更简单,如果您的代码在支持 .map
的环境中运行:
getClosures: function(arr, fn) {
return arr.map(function(v) {
return function() {
fn(v);
};
});
},
相关问题:
关于javascript - 返回函数数组 : creating closures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17379386/