我们通常知道常用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下
我们通常知道常用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下
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将它们都放入队列。
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
因為
alert(2); // 返回 undefined
因此
setTimeout(alert(2), 0);
就相當於