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

How to create closure in loop and store it in variable for later execution

本文关键字:变量 存储 执行 循环 创建 闭包      更新时间:2023-09-26

见下面的代码。我试着把它剥得只剩骨架了。

我有一个_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));