setTimeout / setInterval是浏览器和node.js都有的方法。
setImmediate / process.nextTick()是node.js里的方法。
window.setImmediate部分浏览器存在,不是标准,可能也不会成为标准。
简介
setTimeout:延迟一段时间之后执行。
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
func|code 想要执行的函数或代码字符串。
delay 执行前的延时,单位毫秒,默认为0;
arg1,arg2… 要传入被执行函数(或代码字符串)的参数列表(IE9 以下不支持)
取消调度:clearTimeout(timerId)
setInterval: 间隔一定时间重复执行。
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
参数同setTimeout。
取消调度:clearInterval(timerId)
计时规则
计时使用独立的定时器线程,计时完毕,将回调函数推入事件队列中,等待主线程执行。
setInterval严格按照间隔时间计时,不管回调执行多长时间,只要时间到了,就把下一个任务推入事件队列等待JS引擎空闲后执行。因此如果执行时间超出间隔时间,后面的回调会等待这一次执行完(且在JS引擎空闲时)立即执行。
嵌套的setTimeout只有在当前回调执行完,才开始安排下一次的计时。
(setTimeout/setInterval执行规则相关知识:Event Loop事件循环机制)
HTML5标准规定,浏览器环境中setTimeout嵌套/setInterval循环从第五次开始,间隔时间至少为4毫秒。
node.js则没有这个限制。
请注意,所有的调度方法都不能保证确切的延时。浏览器内的计时器可能由于许多原因而变慢:例如CPU 过载、浏览器标签页处于后台模式、笔记本电脑用的是电池供电(使用电池供电会以降低性能为代价提升续航)。所有这些因素,可能会将定时器的最小计时器分辨率(最小延迟)增加到 300ms 甚至 1000ms,具体以浏览器及其设置为准。
垃圾回收和闭包
当一个函数传入setInterval/setTimeout时,将为其创建一个内部引用,并保存在调度器中。因此,即使这个函数没有其他引用,也能防止被垃圾回收器回收。
对于setInterval,传入的函数也是一直存在于内存中,直到clearInterval被调用。
这种引用机制带来了副作用:如果函数引用了外部变量(形成闭包),那么只要这个函数还存在,外部变量也会随之存在。它们可能比函数本身占用更多的内存。因此,当我们不再需要调度函数时,最好使用clearTimeout和clearInterval取消它。
关于找一找教程网
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[详解setTimeout/setInterval(浏览器环境)]http://www.zyiz.net/tech/detail-120067.html