我在这段代码上有一个例子:
<script>
for(var i=1; i<3; i++){
setTimeout(function(){
say("HELLO NUMBER " + i);
}, i * 2000);
}
function say(text){
alert(text);
}
</script>
我需要的输出是:
提醒(“HELLO NUMBER 1”);
提醒(“HELLO NUMBER 2”);
但在这种情况下,我仍然得到输出:
提醒(“HELLO NUMBER 3”);
任何人都可以为此提供帮助吗?谢谢:))
答案 0 :(得分:7)
关闭的经典问题
for(var i=1; i<=3; i++){
(function(num){
setTimeout(function(){
say("HELLO NUMBER " + num);
}, num * 2000);
})(i)
}
function say(text){
alert(text);
}
演示:Fiddle
您正在i
回调中使用闭包变量setTimeout
,其值仅在执行回调时计算,然后i
的值将由外部循环更新
答案 1 :(得分:0)
另一种方式。
var out = [];
for(var i=0; i<3; ++i){
out.push(i+1);
setTimeout(function(){
say("HELLO NUMBER " + out.shift());
}, i * 2000);
}
function say(text){
alert(text);
}
答案 2 :(得分:0)
每次迭代都需要一个闭包值i:
for (var i=1; i<3; i++) {
(function(j){
setTimeout(function() { alert("HELLO NUMBER " + j); }, j*2000);
})(i)
}
答案 3 :(得分:0)
<script>
function doSetTimeout(i) {
setTimeout(function() { say("HELLO NUMBER " + i); }, 3000);
}
for(var i=1; i<3; i++){
doSetTimeout(i);
}
function say(text){
alert(text);
}
</script>