`setInterval`表观无限循环

时间:2013-12-28 03:46:05

标签: javascript setinterval

当我用下面的JavaScript打开HTML时,starting timer会在控制台中被记录,但是我的鼠标图标就会旋转。

window.onload = function() {
    console.log("starting timer");
    var n = 0;
    var id = setInterval(function() { console.log("hello"); n++ }, 100);
    while(true) {
        if( n > 5 ) {
              clearInterval(id);
              break;
        }
    }
    console.log("finished timer");
}

我在这里创建了某种类型的无限循环吗?

3 个答案:

答案 0 :(得分:4)

JavaScript / DOM是设计上的单线程。

虽然JS正在旋转你的这个循环:

while(true) {
      ...
}

没有其他JS代码被执行,包括你在setInterval()中提供的回调,因此n总是为零。

因此,是的,你在那里有无限循环。

答案 1 :(得分:2)

问题是JavaScript是单线程的。 (这是一个特性。)你的setInterval函数将不会执行,直到window.onload函数返回,它永远不会发生,因为中断永远不会发生,因为n永远不会增加。

答案 2 :(得分:1)

问题是while(true)语句正在尽快重新运行。一旦完成,它就会重新启动,并且没有时间用于其他任何事情,冻结浏览器。你应该在其内部进行setInterval检查。 e.g:

window.onload=function(){
    console.log('starting timer');
    var n=0;
    var id=setInterval(function(){console.log('hello');n++;if(n>5){
        clearInterval(id);
        console.log('finished timer');
    },100);
}