SetTimeout 的伪多线程

突然想起面试的时候一道面试题,当时答的不是很好,今天又重新研究了一下。
题目是这样的:

setTimeout(fuc,100);

这是一个简单的定时器,问题在于如果fuc函数的执行时间过于耗时,超过100毫秒,那会出现什么问题,怎么解决。
一、出现的问题就是fuc函数不会100ms之后执行,而是等到fuc函数执行完成之后执行setTimeout定时器,也意味着真实的延迟时间会比设定的时间长。
二、怎么解决,这就厉害了。
1、方法总体来说就是fuc的耗时减少
2、JS是单线程的执行,如果fuc函数为多线程也就是异步执行就ok了。
第一种方法不说了,就是方案设计上的废话。
第二种就厉害了。我们假设这个执行耗时的函数是一个循环。

function fuc(){
    for(var i=0xA00000;i<0xFFFFFF;i++) {        $("div").css("backgroundColor","#"+i.toString(16));}   
}

这个代码片段不仅耗时,而且会把浏览器卡死。下面用settimeout一个伪多线程的方法setTimeout(fuc,0);

var timer;
var i=0x100000;
function func() {
  timer = setTimeout(func, 0);
 $("div").css("backgroundColor","#"+i.toString(16));}
  if (i++ == 0xFFFFFF) clearInterval(timer);
}
timer = setTimeout(func, 0);

经过我的实测,不会卡死很流畅。
其中的缘由要讲一下setTimeout(fuc,0);的原理。
setTimeout的最小延迟时间为4ms也就意味这即使我们写0,在执行setTimeout(fuc,0);的时候也会自动编译成setTimeout(fuc,4);
所以相当于每隔4ms执行一次。效果就是setTimeout(f,0)必须要等到当前脚本的所有同步任务结束后才会执行。

具体更详细的说明看这里:资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值