我需要能够构建一个匿名函数数组,这些函数使用每个函数的唯一参数执行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]));
}
想法?
答案 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]()