对于 JS 中定时器的一个总结 :

前置知识 :


  • 单线程模型 ?

JavaScript 一门 单线程语言(执行引擎在同一时间只做一件事)。单线程是指 JavaScript 的主线程只有一个。除了这个主线程,JavaScript 还有一个 I/O 线程,通过事件循环来处理 I/O 问题,但两者之间相对独立,不需要进行状态同步,因此我们仍然可以把 JavaScript 看成一门单线程语言。

  • 任务队列 ?

任务队列,就是用于存储等待执行的任务的队列。由于 JavaScript 是一门单线程语言,如果当前有一个任务需要执行,但 JavaScript 引擎正在执行其他任务,那么这个任务就需要放进一个队列中进行等待。等到线程空闲时,就可以从这个队列中取出最早加入的任务进行执行。如果当前线程空闲,并且队列为空,那每次加入队列的函数将立即执行。


JS 定时器 :


  • setTimeout 定义 ?

setTimeout 是 JavaScript 引擎提供的定时器方法,用于 函数的延时执行。主要思想是通过一个定时器,让函数在计时结束后在执行。setTimeout(func, delay, args)设置 超时调用。如对于setTimeout(func, 100, args),js引擎会为func函数设置一个计时器,100毫秒后,将func添加到任务队列等待执行。

  • setInterval 定义 ?

setInterval 也是 JavaScript 引擎提供的定时器方法,用于 函数的循环调用。主要思想是每隔一定的时间,就启动一次函数的执行。setInterval(func, interval, args)设置 循环调用。对于语句setInterval(func, 100, args),js引擎每隔100毫秒就会把func添加到任务队列一次。

  • setTimeout 和 setInterval 的异同点 ?

相同点:

  1. 两者都会加入同一任务队列,等待线程空闲时执行。
  2. 两者都无法保证在何时执行回调,因为无法知道线程何时空闲。

不同点 :

  1. setTimeout只会将函数添加到任务队列一次,而setInterval则是循环往队列中添加函数。
  2. setTimeout可以保证函数在指定的时间间隔内不会执行,而setInterval无法保证(有可能出现接近连续执行的情况)。
  • setTimeout 运行机制 ?

在执行该语句时,设置一个定时器,定时时间置为所设置的延时,当计时结束后,将传入的函数加入任务队列,之后的执行就交给任务队列负责。 clearTimeout : setTimeout函数本身会返回一个句柄,我们可以在函数执行前通过向 clearTimeout 传入该句柄取消函数的执行。

  • setInterval 运行机制 ?

本质上就是每隔一定的时间向任务队列添加回调函数。但setInterval有一个原则:在向队列中添加回调函数时,如果队列中存在之前由其添加的回调函数,就放弃本次添加(不会影响之后的计时)。clearInterval : setInterval 函数本身会返回一个句柄,我们可以在函数执行前通过向 clearInterval 传入该句柄取消函数的执行。

  • setTimeout 使用场景 ?

setTimeout 主要用于需要进行 延时调用的场景 中。(函数的防抖和节流)由于setInterval存在的性能问题,在实际的编码中,开发人员通常会使用 setTimeout 来模拟 setInterval,以防止出现函数连续执行的情况。

  • setInterval 使用场景 ?

尽管存在上述性能问题,setInterval 的使用场景相对较少,但当所使用的接口来自外部(即回调函数本身无法修改)时,就必须通过 setInterval 来实现 循环执行 了。此外,对于 动画效果 来说,我们通常会希望动画运行的更加平滑(也就是希望函数运行得更频繁),这时使用 setInterval 往往更加流畅。

  • setInterval  性能差于 setTimeout 的原因 ?
  1. setInterval 无视代码错误:setInterval有个讨厌的习惯,即对自己调用的代码是否报错这件事漠不关心。换句话说,如果setInterval执行的代码由于某种原因出了错,它还会持续不断(不管不顾)地调用该代码。
  2. setInterval 无视网络延迟:假设你每隔一段时间就通过 Ajax 轮询一次服务器,看看有没有新数据(注意:如果你真的这么做了,那恐怕你做错了;建议使用“补偿性轮询”(backoff polling))。而由于某些原因(服务器过载、临时断网、流量剧增、用户带宽受限),你的请求要花的时间远比你想象的要长。但 setInterval 不在乎。它仍然会按定时持续不断地触发请求,最终你的客户端网络队列会塞满 Ajax 调用。
  3. setInterval 不保证执行间隔:与setTimeout不同,你并不能保证到了时间间隔,代码就准能执行。如果你调用的函数需要花较长时间才能完成,那某些调用会被直接忽略。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值