我们通常知道常用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);
就相當於
js
var 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将它们都放入队列。