使用apply()执行带有args

时间:2015-12-29 14:55:46

标签: 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()只能看到&#39; undefined&#39;因为该功能已经执行。

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]));
}

想法?

2 个答案:

答案 0 :(得分:1)

使用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]));
}

答案 1 :(得分:1)

这就是你想要的。

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

func_array[0]()
func_array[1]()