javascript - 返回函数数组 : creating closures

标签 javascript function closures

鉴于此函数调用:

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)); 在这里没有任何好处。如果删除它,代码将具有完全相同的行为。如果您想捕获 iarray 的当前值,您必须将它移动到 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);
}

这首先违背了生成函数的目的。

如果你想创建一个可以访问函数定义范围内的 iarray 的闭包,不要定义同名参数.

可能的解决方案:

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/

相关文章:

javascript - 直接从另一个 CommonJS 模块导出

javascript - 如何在没有 npm/webpack 的情况下从 HTML 文件导入 React 模块

javascript - 我需要将图像从一个元素移动到另一个元素

python - 将函数绑定(bind)到 Kivy 按钮

c++ - 在 C++ 中访问 return 语句后执行函数中的代码

javascript - 覆盖 google.com 匿名函数的一部分

c# - 闭包有什么特别之处?

javascript - Javascript 中闭包的具体用途是什么?

意外结果的 C++ 闭包

javascript - 将参数传递给 Vuex 中的 mapGetters