javascript - 如何在循环中创建闭包并将其存储在变量中供以后执行

标签 javascript closures

请参阅下面的代码。我试着把它剥到光秃秃的骨头上。

我有一个 _queue 数组。我想迭代 10 次。在每次迭代中,我想创建一个函数,该函数对 j 具有适当范围的引用(即第一次迭代时 j=0,第二次迭代时 j=1,等等)

我想将该函数存储在变量 f 中,然后将 f 添加到 _queue 数组以便稍后调用它。

问题当然是在第一个循环的每次迭代中,不是将闭包存储在 f 中,而是立即执行闭包。

我的问题是:如何使用适当的 j 变量存储函数,以便我可以将它添加到 _queue 数组?

    _queue = [];

    for (j = 0; j < 10; j++) {

        var f =
          (function (index) {
            alert(index);
        })(j);                    //code is executed here instead of stored in the f variable

        _queue.push(f);  //Add f 

    }

    for (k = 0; k < _queue.length; k++){
        _queue[k].call();
    }

最佳答案

使用立即函数(或一般使用函数)引入新作用域是正确的。但是你必须从立即函数返回一个函数:

var f = (function (index) {
    return function() {
       alert(index);
    };
}(j));     

关于javascript - 如何在循环中创建闭包并将其存储在变量中供以后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606059/

相关文章:

swift - Swift 1.2 中的 @noescape 属性

rust - 如何通过原始指针将闭包作为参数传递给 C 函数?

rust - 将 Struct <'a>::method as a ` 传递给 <'a> Fn(&Foo<' a>)` 以在闭包中使用

javascript - AngularJS - $compile 之后,html 中的调用新函数运行多次

javascript - JSON 语法 - 变量被解释为文字

javascript - 如果未设置 Cookie,则不希望出现错误

swift - 如何从快照闭包返回数组的值并使用它来准备segue?

c# - 访问修改后的闭包 (2)

javascript - 我们如何合并两个 instagram API 的结果

javascript - 使用 JavaScript 动态更改值