setTimeout 语法不正确

Incorrect syntax on setTimeout

我正在尝试制作一个虚假的加载屏幕,我需要在加载消息之间有大约 20-50 毫秒左右的延迟,以便人们可以在切换到初始化屏幕之前真正看到发生了什么。激活它的按钮转到以下功能:

function gameinit() {
    for (k = 0; k <=1; k += 0.125) {
        setTimeout(function () {
            var nexttxt = "Loading... " + toString(100 * k) + "%"
        }, 20);
        displayupdate(nexttxt);
    }
}

然而,当我使用 JShint 时,这是一个不正确的语法(在 JSfiddle - https://jsfiddle.net/YoshiBoy13/xLn7wbg6/2/) - 特别是第四行和第五行。我已经查看了这方面的指南,似乎 一切都井井有条。我做错了什么?

(注意:displayupdate(nexttxt) 用下一行文本更新

标签)

执行脚本时,没有任何反应 - HTML 上的十六行文本正常向上移动,前八行被 gameinit() 函数生成的八行替换,但 gameinit( ) 只生成空白。如果脚本再次执行,它只输出八行 112.5%(好像是 for 循环的第 9 次迭代)。

我几乎可以肯定这是我错过的一些基本知识,有人可以告诉我我做错了什么吗?

使用setInterval() instead, you can clear interval using clearInterval()

function gameinit() {
  displayupdate("Loading... 0%");
  var k = 0;
  var inter = setInterval(function() {
    if (k < 1) {
      k += .25;
      displayupdate("Loading... " + 100 * k + "%")
    } else {
      clearInterval(inter);
    }
  }, 2000);
}

function displayupdate(d) {
  console.log(d);
}

gameinit();

setTimeout 不能像您期望的那样在循环内工作。您必须为传递给 setTimeout 的每个循环变量创建一个闭包,或者创建一个新函数来执行 setTimeout 操作。

function gameinit() {
    for (var k = 0; k <= 1; k += 0.125) {
        doSetTimeOut(k);
    }
}

function doSetTimeOut(k) {
    setTimeout(function() {
        var nexttxt = "Loading... " + toString(100 * k) + "%"
    }, 20);
    displayupdate(nexttxt);
}

这里有另一个函数可以做得更好---- setInterval

   var txt = '';
   var time = 0; 
   var id = setInterval(function(){
      console.log("loading..."+time/8*100+"%");
      if(time++>7)
         clearInterval(id);
   },1000);