setTimeout 0秒问题;

阿飞i
  • 628

我们通常知道常用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下

回复
阅读 4.9k
4 个回答

因為

alert(2); // 返回 undefined

因此

setTimeout(alert(2), 0);

就相當於

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

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

qianjiahao
  • 8.4k

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将它们都放入队列。

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏