其他分享
首页 > 其他分享> > setTimeout 为什么会出现误差?

setTimeout 为什么会出现误差?

作者:互联网

1.JS是单线程的
2.进程(process) 指的是CPU 在 运行指令及加载和保存上下文所需的时间,放在应用上是指计算机中已运行的程序。
3.线程(thread) 是操作系统能够进行运算的最小单位。它被包含在 进程 之中,描述了执行一段指令所需的时间。
4.执行栈可以理解为是用来存储函数调用的栈,遵循先进后出的原则

//微任务(microtask)
process.nextTick
promise
Object.observe(曾经是提案,如今已经废除)
MutationOberver

//宏任务(macrotask)
script
setTimeout
setInterval
setImmediate
I/O
UI渲染

5.执行顺序如下:
//执行同步代码,这是宏任务
//执行栈为空,查询是否有微任务要执行
//必要时渲染UI
//进行下一轮的 EventLoop ,执行宏任务中的异步代码

6.setTimeout 误差
上面讲了定时器是属于 宏任务(macrotask) 。如果当前 执行栈 所花费的时间大于 定时器 时间,那么定时器的回调在 宏任务(macrotask) 里,来不及去调用,所有这个时间会有误差。
setTimeout(function () {
    console.log('biubiu');
}, 1000);

某个执行时间很长的函数();

如果定时器下面的函数执行要 5秒钟,那么定时器里的log 则需要 5秒之后再执行,函数占用了当前 执行栈 ,要等执行栈执行完毕后再去读取 微任务(microtask),等 微任务(microtask) 完成,这个时候才会去读取 宏任务(macrotask) 里面的 setTimeout 回调函数执行。setInterval 同理,例如每3秒放入宏任务,也要等到执行栈的完成。

还有一种情况如下:

setTimeout(function() {
    setTimeout(function() {
        setTimeout(function() {
            setTimeout(function() {
                setTimeout(function() {
                    setTimeout(function() {
                        console.log('嘤嘤嘤');
                    }, 0);
                }, 0);
            }, 0);
        }, 0);
    }, 0);
}, 0);

在最新的规范里有这么一句: If nesting level is greater than 5, and timeout is less than 4, then increase timeout to 4.

所以意思就是意思就是如果timeout嵌套大于 5层,而时间间隔小于4ms,则时间间隔增加到4ms。

标签:function,误差,macrotask,执行,为什么,任务,定时器,setTimeout
来源: https://blog.csdn.net/xigua9/article/details/117718363