我有这个脚本:
for (var i = 1; i <= 2; i++) {
setTimeout(function() { alert(i) }, 100);
}
但是3被提醒两次,而不是1和2。
有没有一种方法传递i,而不把函数写成字符串?
我有这个脚本:
for (var i = 1; i <= 2; i++) {
setTimeout(function() { alert(i) }, 100);
}
但是3被提醒两次,而不是1和2。
有没有一种方法传递i,而不把函数写成字符串?
当前回答
可以使用setTimeout的额外参数将参数传递给回调函数。
for (var i = 1; i <= 2; i++) { setTimeout(function(j) { alert(j) }, 100, i); }
注意:这在IE9及以下浏览器上不起作用。
其他回答
答案?
我用它来做一个添加物品到购物车的动画——当点击产品“添加”按钮时,一个购物车图标浮动到购物车区域:
function addCartItem(opts) {
for (var i=0; i<opts.qty; i++) {
setTimeout(function() {
console.log('ADDED ONE!');
}, 1000*i);
}
};
时间单位为单位乘以n周期。
因此,从点击时刻开始,动画开始epoc(每个动画的)是每个一秒单位乘以项目数量的乘积。
epoc: https://en.wikipedia.org/wiki/Epoch_ (reference_date)
希望这能有所帮助!
好吧,另一个基于科迪的答案但更一般的解决方案是这样的:
function timedAlert(msg, timing){
setTimeout(function(){
alert(msg);
}, timing);
}
function yourFunction(time, counter){
for (var i = 1; i <= counter; i++) {
var msg = i, timing = i * time * 1000; //this is in seconds
timedAlert (msg, timing);
};
}
yourFunction(timeInSeconds, counter); // well here are the values of your choice.
setTimeout的函数参数在循环变量上关闭。循环在第一个超时之前结束,并显示当前值i,即3。
因为JavaScript变量只有函数作用域,解决方案是将循环变量传递给设置超时的函数。你可以像这样声明和调用这样的函数:
for (var i = 1; i <= 2; i++) {
(function (x) {
setTimeout(function () { alert(x); }, 100);
})(i);
}
你可以使用立即调用的函数表达式(IIFE)来创建一个围绕setTimeout的闭包:
for (var i = 1; i <= 3; i++) { (函数(索引) { setTimeout(function() { alert(index); }, i * 1000); })(i); }
真正的解决方案在这里,但是您需要熟悉PHP编程语言。 你必须混合使用PHP和JAVASCRIPT才能达到你的目的。
请注意:
<?php
for($i=1;$i<=3;$i++){
echo "<script language='javascript' >
setTimeout(function(){alert('".$i."');},3000);
</script>";
}
?>
它完全是你想要的,但要小心如何使之间的关系 PHP变量和JAVASCRIPT变量。