gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:15:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com