JavaScript事件循环是JavaScript运行时的一种机制,它用来管理异步任务的执行以及控制同步任务的执行。JavaScript事件循环的每一个执行周期被称作一个“事件循环周期”(Event Loop Cycle)。在每一个事件循环周期中,都有若干个同步任务和异步任务待执行。
在开始详细讲解JavaScript事件循环之前,首先需要明确同步任务和异步任务的概念。
同步任务(Synchronous Task):在JavaScript程序执行时,必须执行完成才能执行后续任务的任务,一旦开始执行就不会停止,直到执行完成。例如:变量声明、函数调用、循环等。
异步任务(Asynchronous Task):在JavaScript程序执行时,可以被推迟执行的任务。异步任务执行时,不会阻塞程序的执行,程序将继续执行其他任务。例如:Ajax请求、定时器、事件监听器等。
JavaScript事件循环机制主要分为以下两个阶段:
- 执行栈阶段(同步任务执行阶段)
- 任务队列阶段(异步任务执行阶段)
在执行栈阶段中,JS引擎会将所有被执行的JavaScript代码按照它们在代码中出现的顺序依次添加到执行栈中,并且一旦一个任务从执行栈中被添加完成并执行完成,JS引擎会将它移除出执行栈。
当一个异步任务被推迟执行时,它会被添加到任务队列中等待执行。而每当执行栈中的同步任务执行完成,JS引擎就会检查任务队列中是否存在要执行的任务,如果存在就从任务队列中将该任务取出并添加到执行栈中,进行执行。这个过程就是所谓的“事件循环”的一遍。
示例1:
console.log('同步任务1'); // 执行同步任务1
setTimeout(function() {
console.log('异步任务1'); // 延时2秒后执行异步任务1
}, 2000);
console.log('同步任务2'); // 执行同步任务2
在上述示例中,JavaScript代码的执行过程如下:
- 执行第一行代码,输出“同步任务1”;
- 执行第二行代码,将异步任务1添加到任务队列中,等待2秒后执行;
- 执行第三行代码,输出“同步任务2”;
- 2秒过后,JS引擎检查任务队列,发现异步任务1已经可以被执行,于是将异步任务1从任务队列中移除,并添加到执行栈中,执行输出:“异步任务1”;
示例2:
console.log('同步任务1'); // 执行同步任务1
setTimeout(function() {
console.log('异步任务1'); // 延时0秒后执行异步任务1
}, 0);
console.log('同步任务2'); // 执行同步任务2
在上述示例中,JavaScript代码的执行过程如下:
- 执行第一行代码,输出“同步任务1”;
- 执行第二行代码,将异步任务1添加到任务队列中,并等待执行;
- 执行第三行代码,输出“同步任务2”;
- JS引擎检查任务队列,发现异步任务1已经可以被执行,于是将异步任务1从任务队列中移除,并添加到执行栈中,执行输出:“异步任务1”。
需要注意的是,在第二个示例中,虽然异步任务的延时是0秒,但它也是一个异步任务,需要等待执行栈中的所有同步任务执行完毕之后,才会被添加到任务队列中等待执行。所以,最终输出的顺序会是:“同步任务1”、“同步任务2”、“异步任务1”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript事件循环同步任务与异步任务 - Python技术站