关于js的事件循环机制,我们知道JavaScript是一种单线程的语言,也就是说JavaScript中的代码是按照顺序执行的,遇到耗时的任务会阻塞主线程,导致页面卡顿甚至崩溃。但是JavaScript又有很多需要异步执行,比如Ajax请求、定时器等。所以JavaScript的事件循环机制就应运而生。
事件循环机制的概念
事件循环机制是一个非常重要的概念,它是指JavaScript中始终存在一个事件循环的过程,用于监听和处理事件队列中的事件。事件循环机制包括以下几个步骤:
-
JavaScript引擎首先会检查主线程是否有待处理的任务,如果有,则按照顺序执行。
-
当主线程没有任务时,JavaScript引擎就会从事件队列中取出第一个事件,并将其对应的回调函数压入调用栈中执行。
-
当事件回调函数执行完成,如果调用栈中还有任务,则将调用栈中的下一个任务取出执行;如果调用栈为空,则回到第二步,继续从事件队列中取出下一个事件。
-
重复以上步骤,直到事件队列和调用栈中都没有任务为止。
示例说明
下面我们通过两个示例来解释一下事件循环机制的具体表现。
示例一:setTimeout
console.log('start');
setTimeout(function(){
console.log('timeout');
}, 0);
console.log('end');
当我们执行这段代码时,控制台输出的顺序应该是:start -> end -> timeout。为什么呢?因为setTimeout是一个异步函数,并不会阻塞主线程,所以调用setTimeout后,主线程会顺序执行console.log('end')这句话,然后将该事件压入事件队列中。当主线程执行完所有任务后,就会从事件队列中取出该事件,并将对应的回调函数执行。
示例二:Promise
console.log('start');
new Promise(function(resolve, reject){
console.log('promise1');
resolve();
}).then(function(){
console.log('then1');
new Promise(function(resolve, reject){
console.log('promise2');
resolve();
}).then(function(){
console.log('then2');
});
}).then(function(){
console.log('then3');
});
console.log('end');
示例二中,我们通过Promise来演示事件循环机制,控制台输出的顺序应该是:start -> promise1 -> end -> then1 -> promise2 -> then2 -> then3。当执行到第一行console.log('start')时,console会输出start。之后,创建了一个Promise对象并执行了其中的回调函数,console输出promise1,然后调用resolve(),使Promise对象状态从pending变为resolved,然后执行第一个then中的回调函数,输出then1,接着新建了一个Promise对象并输出promise2,调用resolve()后,该Promise对象状态也变为resolved,接着执行第二个then中的回调函数,输出then2。执行完第二个then中的回调函数后,还有一个then,所以接着执行第三个then中的回调函数,console输出then3,流程结束。
通过示例介绍,我们对事件循环机制的掌握更加深入了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于js的事件循环机制剖析 - Python技术站