我需要能够构建一个匿名函数数组,这些函数使用每个函数的唯一参数执行 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/