gpt4 book ai didi

javascript - 在循环中将函数传递给 setTimeout : always the last value?

转载 作者:行者123 更新时间:2023-12-03 13:38:58 30 4
gpt4 key购买 nike

我正在尝试使用 setTimeout 执行一个匿名函数,我将信息传递到该函数中,但遇到了麻烦。这个(硬编码版本)可以正常工作:

setTimeout(function(){alert("hello");},1000);
setTimeout(function(){alert("world");},2000);

但我试图从数组中获取 hello 和 world 并将它们传递给函数,而不使用(a)使用全局变量和(2)使用 eval。我知道如何使用 globals 或 eval 来做到这一点,但没有我怎么能做到。这是我想做的(但我知道它行不通):
var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
setTimeout( function(){alert(strings[i]);}, delay);
delay += 1000;
}

当然 strings[i] 将脱离上下文。如何在没有 eval 或全局变量的情况下将字符串 [i] 传递给该匿名函数?

最佳答案

这是非常频繁重复的“我如何在闭包中使用循环变量”的问题。

规范的解决方案是调用一个函数,该函数返回一个绑定(bind)到循环变量当前值的函数:

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

外定义 function(s) { ... }创建一个新范围,其中 s绑定(bind)到所提供参数的当前值 - 即 strings[i] - 它可用于内部范围。

关于javascript - 在循环中将函数传递给 setTimeout : always the last value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6425062/

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