javascript - setTimeout 0秒问题;
高洛峰
高洛峰 2017-04-10 15:07:41
[JavaScript讨论组]

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
ringa_lee

因為

alert(2); // 返回 undefined

因此

setTimeout(alert(2), 0);

就相當於

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

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

天蓬老师

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

ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号