如何解决javascript setTimeout 在 while 循环中
你好,我想有 4 个超时时间来更新球的位置,因为球的速度不同。 这是我的代码的一部分:
var i=1;
while(i<=5)
{
console.log(i);
intervals[i-1]=setInterval(function()
{
MoveBallHorizontalyWithSpeed(i);
MoveBallVerticalyWithSpeed(i);
showBalls();
console.log(i);
},speed/i);
i++;
}
问题是每次超时都会调用 6 个函数,但我希望第一个超时调用 MoveBallHorizontalyWithSpeed(1) 第二个 MoveBallHorizontalyWithSpeed(2) 等...
有没有比写入每个超时更快的方法?
解决方法
请试试这个:
var i=1;
while(i<=5)
{
console.log(i);
const j = i;
intervals[i-1]=setInterval(function()
{
MoveBallHorizontalyWithSpeed(j);
MoveBallVerticalyWithSpeed(j);
showBalls();
console.log(j);
},speed/j);
i++;
}
,
问题是您在循环内使用了全局变量,因此所有 setInterval 函数都使用相同的变量 i
,在这种情况下始终使用局部变量。您应该像这样更改代码:
for(let i = 1; i<=5; i++)
{
console.log(i);
setInterval(function()
{
console.log(i);
},2000);
}
while 循环将完成其执行并更新 i
的值的原因。因此,当 setInterval
执行时,它会获得 i
的最新值,即 6。
为了避免这种情况,您可以创建一个闭包和一个 IIFE,并将 i 的值作为参数传递给 IIFE。在 IIFE 中,您可以调用 setInterval
var i = 1;
intervals = [];
while (i <= 5) {
intervals[i - 1] = (function(x) {
setInterval(function() {
MoveBallHorizontalyWithSpeed(x);
MoveBallVerticalyWithSpeed(x);
},10 / x);
})(i)
i++;
}
function MoveBallVerticalyWithSpeed(speed) {
console.log(speed)
}
function MoveBallHorizontalyWithSpeed(speed) {
console.log(speed)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。