javascript,setTimeout定时器的精度可能不高,javascript引擎不是你想的那样

发布时间:2024年01月14日

javascript引擎,它运行在宿主环境中,对前端来说,一般是web浏览器,
代码运行到浏览器。
专业术语:
事件循环:浏览器提供了一种机制来处理程序中多个块的执行,且执行每块时调用javascript引擎,这种机制被称为事件循环
特点:
1.它的运行是单线程
2.完整运行,一个好了再下一次
以下伪代码了解一下概念,(摘自《你不知道的javascript》中),根据我的理解,再加了一些说明。

// eventLoop是一个用作队列的数组
    // 先进, 先出   这但很重要,就是单线程的意思
    var eventLoop = []; // 假设数组里有很多事件在排队运行了
    var event;
    // “永远” 执行
    while(true) {
      // 一次tick
      if(eventLoop.length > 0) {
        // 拿到队列中的下一个事件
        event = eventLoop.shift();
        // 现在, 执行下一个事件
        try {
          event()
        }catch (err) {
          // 报错,进行下一步处理
        }
      }
    }

说明:
对每个tick而言,如果在队列中有等待事件,那么就会从队列中摘下一个事件并执行。定要清楚,setTimeout(…)并没有把你的回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,环境会把你的回调函数放在事件循环中,这样,在未来某个时刻的tick会摘下并执行这个回调。

比如你的setTimeout,是1000毫秒后执行,也就是1秒,但是现在队列里面有有20个项目了, setTimeout函数一秒已经到了,但是得排在20个项目后面再执行,为了理解如果20项目要执行要2分钟,那setTimeout函数就是2分钟1秒执行。
所以setTimeout定时器的精度可能不高,你理解了吗

文章来源:https://blog.csdn.net/tangxiaobao2016/article/details/135555321
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。