首页 > setTimeout 0秒问题;

setTimeout 0秒问题;

我们通常知道常用setTimeout 0秒来解决动画或者一些效果的延迟问题;
众所周知js是单线程,用0秒能把要执行的任务从队列中提出来。
其实我也不太懂 有这个问题
alert(1);setTimeout(alert(2),0);alert(3); // 1 2 3
alert(1);setTimeout("alert(2)",0);alert(3);//1 3 2

setTimeout加引号类似eval()全局作用域, 可我现在都是在window下


alert要换成console.log,尤其是在异步的测试中。


你这个和 setTimeout 没有关系,是你的写法有问题,setTimeout 的第一个参数应该是一个函数,而第一个是 alert(2) 的返回值。


因為

alert(2); // 返回 undefined

因此

setTimeout(alert(2), 0);

就相當於

jsvar foo = alert(2); // undefined
setTimeout(foo, 0); // 或 setTimeout(undefined, 0);

setTimeout()会把函数延迟到队列里,其实你该这么写:

alert(1);
setTimeout(function(){alert(2)},0);
alert(3); 

举个例子,做个试验:

console.log('1');
setTimeout(function(){
    console.log('3');
},1000);
var str;
for(var i = 0;i<10000000;i++){
    str +=i;
}
setTimeout(function(){
    console.log('2');
},500);

所谓”正常“的顺序执行后,应该是 :
- 1立刻显示
- 然后 1秒后3
- 然后等等。。。因为计算量大。。。
- 然后计算完了 0.5秒后 2

其实不是,你可以试试,会发现在for循环前的3被强制等到了for循环结束才显示!

这是因为setTimeout将它们都放入队列。

【热门文章】
【热门文章】