我有这个脚本:
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,而不把函数写成字符串?
当前回答
真正的解决方案在这里,但是您需要熟悉PHP编程语言。 你必须混合使用PHP和JAVASCRIPT才能达到你的目的。
请注意:
<?php
for($i=1;$i<=3;$i++){
echo "<script language='javascript' >
setTimeout(function(){alert('".$i."');},3000);
</script>";
}
?>
它完全是你想要的,但要小心如何使之间的关系 PHP变量和JAVASCRIPT变量。
其他回答
答案?
我用它来做一个添加物品到购物车的动画——当点击产品“添加”按钮时,一个购物车图标浮动到购物车区域:
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)
希望这能有所帮助!
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); }
我也遇到过同样的问题这就是我解决的方法。
假设我想要12个间隔为2秒的延迟
function animate(i){
myVar=setTimeout(function(){
alert(i);
if(i==12){
clearTimeout(myVar);
return;
}
animate(i+1)
},2000)
}
var i=1; //i is the start point 1 to 12 that is
animate(i); //1,2,3,4..12 will be alerted with 2 sec delay
可以使用setTimeout的额外参数将参数传递给回调函数。
for (var i = 1; i <= 2; i++) { setTimeout(function(j) { alert(j) }, 100, i); }
注意:这在IE9及以下浏览器上不起作用。