js的单线程引擎如何通过timeout实现异步

         浏览器是基于一个事件循环的模型,在这里面,可以有多个任务队列,比如render是一个队列,响应用户输入是一个,script执行是一个。 任务队列里放的是任务,同一个任务来源的任务肯定在同一个任务队列里。 任务有优先级,鼠标或键盘响应事件优先级高,大概是其他任务的3倍。
 
任务的执行过程中可能产生:
spin:不影响Event Loop并延后执行
pause:停止Event Loop并延后执行
 
spin,如setTimeout的异步方式,就是spin方式,当执行到setTimeout时,此任务先暂停并保存,继续执行后续任务,当条件满足时,再将setTimeout的执行任务放回任务队列的后面,等待执行,假如前面有一个2s的任务,那原本是delay 1s的任务实际执行时会是在第3s的时候才执行。
 
pause,则是当在js中获取元素的offsetWidth等需要更新dom操作的动作时发生的。当执行到此任务时,将停止事件循环的工作,也就是先停止js引擎解析执行,跳到渲染引擎更新用户界面至当前状态,这期间,不处理后续任务,当前执行的脚本暂停,界面保持响应,但无法处理输入(事件循环停了),直到成功返回才继续执行任务。
 
function A(fun){    
 var temp = 100;   
 temp = temp * temp;    
 window.setTimeout(function(){  
       fun(temp);
    },0);
 alert("a函数:"+temp);
}
function B(r)
{    
 alert("b函数"+r);
}
A(B);// 调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值