作者:寻路灬鸿 | 来源:互联网 | 2023-10-11 11:10
关于js实行机制,老早之前就一向想写篇文章做个总结,由于和js实行递次的面试题碰到的迥殊多,每次碰到老是会去网上查,没有体系地总结,搞得每次碰到都是似懂非懂的觉得,这篇文章就体系的
关于js实行机制,老早之前就一向想写篇文章做个总结,由于和js实行递次的面试题碰到的迥殊多,每次碰到老是会去网上查,没有体系地总结,搞得每次碰到都是似懂非懂的觉得,这篇文章就体系的总结一下js实行机制。
使命行列
人人都晓得js最大的特性就是单线程实行,这就是为何js简朴易学的一个重要原因,不需要斟酌庞杂的同步题目,然则单线程也会有一个题目,一切的使命在实行的历程当中都必需守候前一个使命实行完成才实行,如许就会带来一个效力的题目,为了处理这个题目,js将使命分为两种:同步使命和异步使命,同步使命就是之前说后一个使命必需守候前一个使命实行完成才实行,是在主线程上实行的,而异步使命不会直接进入主线程实行,而是进入使命行列,只要在使命行列关照异步使命能够实行时,才会被推入主线程实行。让我们来看一个越发直观的流程图:
setTimeout和setInterval
说到异步使命,最常见就是setTimeout和setInterval两兄弟了,setTimeout是耽误肯定时刻后实行,然则只实行一次,setInterval是每隔肯定的时刻实行一次,会实行屡次,然则有时刻我们会发明设置肯定的耽误时刻后,回调函数的实行时刻会比我们设置的时刻要晚,这是为何呢?上面我们说过,在使命实行的时刻setTimeout这类异步使命的回调会被放到异步行列中守候实行,当耽误时刻终了时,假如主线程的使命已实行完了,也就是处在余暇状况时,就会将使命行列的回调推到主线程实行,然则当主线程的使命还没有实行完成时,就只能继承守候,来看一个例子:
let before = new Date()
setTimeout(() => {
console.log(new Date() - before)
}, 1000)
for (let i = 0; i <300000; i++) {
console.log('time delay')
}
从上面的例子就能够看到:当我们实行完setTimeout以后,马上实行20万次的轮回,从实行效果能够看到,setTimeout回调函数中的时刻远高于设置1000ms,这就是由于时刻到了,然则主线程的使命还没有实行完成致使。这类题目在setInterval设置倒计时的常常碰到,倒计时最先的时刻设置的时刻是从服务器拿到的体系时刻很正确,然则假如背面不定期像服务期要求体系时刻举行校准的话,你可能会发明倒计时的误差越来越来大,这就是主线程实行的时刻比设定的耽误时刻长致使的。
macrotask和microtask
在js中,异步使命除了有setTimeout这类的异步使命,另有一类就是es6中很经常使用promise&#8230;then这类的异步使命,因而除了同步使命和异步使命,使命还能够越发细分为macrotask(宏使命)和microtask(微使命)
macrotask: 包含setTimeout、setInterval和实行栈
microtask: 包含Promise、process.nextTick
要想明白这两个观点,直接从一道简朴的面试题入手,来看一个例子:
setTimeout(function() {
console.log(1)
}, 0);
new Promise(function(resolve, reject) {
console.log(2);
resolve()
}).then(function() {
console.log(3)
});
process.nextTick(function () {
console.log(4)
})
console.log(5)
思索一下上面例子的输出效果,我们来仔细分析一下实行历程:
- 第一轮:主线程最先实行,碰到setTimeout,将setTimeout的回调函数丢到宏使命行列中,在往下实行new Promise马上实行,输出2,then的回调函数丢到微使命行列中,再继承实行,碰到process.nextTick,一样将回调函数扔到为使命行列,再继承实行,输出5,当一切宏使命实行完成后看有没有能够实行的微使命,发明有then函数和nextTick两个微使命,先实行哪一个呢?process.nextTick指定的异步使命老是发作在一切异步使命之前,因而先实行process.nextTick输出4然后实行then函数输出3,第一轮实行终了。
- 第二轮从宏使命行列最先,发明setTimeout回调,输出1实行终了,因而效果是25431
最后用一张图来总结一下:
总结
这篇文章简朴引见了js实行机制,愿望看了以后,能够对人人熟悉js的实行机制会有所协助。
假如有毛病或不严谨的处所,迎接批评指正,假如喜好,迎接点赞珍藏