Javascript 为什么我的循环没有在迭代之间等待?setTimeout()

Javascript 为什么我的循环没有在迭代之间等待?setTimeout(),javascript,jquery,loops,Javascript,Jquery,Loops,我正在使用jquery构建一个Simon says游戏,在逐个播放每个声音时遇到了一些问题 当游戏开始时,会生成一个包含20个声音(“移动”)的列表,每个回合将逐个播放。因此,如果移动列表为[‘红色’、‘黄色’、‘绿色’],则在第一个转弯处会播放‘红色’,在第二个转弯处会播放‘红色’和‘黄色’,依此类推 我已经将回合设置为4,我正在尝试让每个声音一个接一个地播放,直到播放4个声音。我正在使用以下代码: turn = 4; var t = 1; while(t <= turn) {

我正在使用jquery构建一个Simon says游戏,在逐个播放每个声音时遇到了一些问题

当游戏开始时,会生成一个包含20个声音(“移动”)的列表,每个回合将逐个播放。因此,如果移动列表为[‘红色’、‘黄色’、‘绿色’],则在第一个转弯处会播放‘红色’,在第二个转弯处会播放‘红色’和‘黄色’,依此类推

我已经将回合设置为4,我正在尝试让每个声音一个接一个地播放,直到播放4个声音。我正在使用以下代码:

turn = 4;
var t = 1;
  while(t <= turn) {
    setTimeout(AIbutton(allMoves[t-1]), 1000);
    t++;
  }
turn=4;
var t=1;

当(tsetTimeout异步运行时,它没有阻塞。如果您想等待超时完成,则需要在给setTimeout的函数回调中进行下一次“循环迭代”

类似这样的方法会奏效:

turn = 4;
var t = 1;
ourTimeout(allMovies, turn, t);

function ourTimeout(allMovies, turn, t){
    AIbutton(allMoves[t-1]);
    if(t <= turn)
        setTimeout(ourTimeout(allMovies, turn, ++t), 1000);
}
需要更改为:

setTimeout(function(){
        ourTimeout(allMovies, turn, ++t);
    }, 1000);

正如@Alnitak所述,您只能将一个异常函数或命名函数传递给setTimeout。传递变量的技巧是按照上述更改完成的(概念称为闭包)。

此代码不正确-您需要将函数引用传递给
setTimeout
(例如,匿名函数表达式),而不是调用
ourTimeout
的结果。这正是我所需要的,我现在明白为什么了。谢谢!
setTimeout(function(){
        ourTimeout(allMovies, turn, ++t);
    }, 1000);