其他分享
首页 > 其他分享> > WebAPI: setTimeout是如何实现的?

WebAPI: setTimeout是如何实现的?

作者:互联网

为了支持定时器的实现,浏览器增加了延时队列

由于消息队列排队和一些系统级别的限制,通过setTimeout设置的回调任务并非总是可以实时地被执行,这样就不能满足一些实时性要求较高的需求了。

定时器在使用过程中存在一些陷阱,如:

原因:在Chrome中,定时器被嵌套调用5次以上,系统会判断该函数方法被阻塞了,如果定时器的调用事件间隔小于4毫秒,浏览器会将每次调用的时间间隔设置为4毫秒。因此不太适合实时性较高的需求,比如通过setTimeout来实现JavaScript动画。

目的:是为了优化后台页面的加载损耗以及降低耗电量

因为Chrome,Safari,Firefox都是以32个bit来存储延时值的,32bit最大只能存放的数字是2147483647(大约24.8天),超过则溢出,导致定时器会被立即执行。

var name = 1;
var Myobj = {
    name: 2,
    showName: function() {
        console.log(this.name);
    }
}
setTimeout(Myobj.showName, 1000)   =======> 打印出1

回调函数中,执行上下文中的this,会被设置为全局window, 严格模式下,设置为undefined。

解决方法:

setTimeout(MyObj.showName.bind(MyObj), 1000)
requestAnimationFrame实现的动画效果比setTimeout好的原因?

requestAnimationFrame是按照系统刷新的节奏调用的,而setTimeout是在特定的时间间隔去执行任务,不到时间间隔不会执行,这样浏览器就没办法自动优化。并且还会因为一些原因延迟执行

标签:WebAPI,执行,定时器,如何,MyObj,setTimeout,showName,1000
来源: https://www.cnblogs.com/zppsakura/p/13886088.html