javascript - 使用 apply() 执行带有 args 的 setTimeouts 数组

标签 javascript closures settimeout

我需要能够构建一个匿名函数数组,这些函数使用每个函数的唯一参数执行 setTimeout。下面的代码已经被提出,并且可以在 SO 上运行,但它只处理 setTimeout 的立即执行。它没有解释如何将一组 setTimeout 函数累积到一个数组中,每个 setTimeout 函数都有自己的闭包,该闭包定义了在执行 setTimeout 时使用的唯一变量。

这是 SO 上已经存在的内容:

var strings = [ "hello", "world" ];
for(var i=0;i<strings.length;i++) {
    setTimeout(
        (function(s) {
            return function() {
                alert(s);
            }
        })(strings[i]), 1000);
}

这是我尝试过的多种排列之一:

var strings = [ "hello", "world" ];
var func_array = [];
for (var i=0; i < strings.length; i++) {
    func_array.push(function() {
      setTimeout(
          (function(s) {
              return function() {
                  alert(s);
              }
          })(strings[i]), 1000);
    });
}

当对 func_array 调用 apply() 时,每次调用的 strings[i] 值都是相同的,即 strings 数组的最终成员。

另一种尝试:这里我们将推送到 func_array 上的函数自动执行,以便正确确定 strings[i] 变量的范围。然而,apply() 只看到“未定义”,因为该函数已经执行了。

var strings = [ "hello", "world" ];
var func_array = [];
for (var i=0; i < strings.length; i++) {
    func_array.push(function(s) {
      setTimeout(
          (function(s) {
              return function() {
                  alert(s);
              }
          })(s), 1000);
    }(strings[i]));
}

想法?

最佳答案

使用Function.prototype.bind() 。它变得比实际简单得多。

var strings = [ "hello", "world" ];
var func_array = [];
for (var i=0; i < strings.length; i++) {
    var fn = function(string){
        return setTimeout(function(){ alert(string) } ,1000);
    };
    func_array.push(fn.bind(this, strings[i]));
}

关于javascript - 使用 apply() 执行带有 args 的 setTimeouts 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34513534/

相关文章:

javascript - 如何在 javascript 中使用 setTimeout 考虑延迟

javascript - 如何记录、创建脚本然后立即使用它

javascript - onclick外部菜单使用jquery隐藏子菜单

javascript - 为什么这个 `do` –`while`循环结束后会重复最后一个值呢?

javascript - 在 DATE 验证列中创建空值

javascript - 将对象推送到状态对象中的数组。 ReactJS

javascript - 使用 JavaScript 创建文本文件,而不使用 Web 界面

JavaScript 闭包和名称破坏

javascript - 命名函数和匿名函数有不同的效果

javascript - setTimeout() 没有执行所需的功能?