JS事件循环机制EVENLOOP

本文深入讲解JavaScript中的事件循环机制,包括执行栈、事件队列、宏任务与微任务的概念及其实现原理。揭示了JavaScript如何通过事件循环机制实现非阻塞特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

	首先,JavaScript是一门单线程的非阻塞的脚本语言:用来与浏览器交互。
	单线程:在执行代码时,只有一个主线程来处理所有任务。
	非阻塞:当代码进行异步任务(需要耗费时间才能返回的任务)时,主线程会挂起这个任务,
然后在异步任务返回结果时再执行相应的回调。

.
那么JavaScript是怎么实现非阻塞的呢——event loop (事件循环)。

执行栈和事件队列

同步代码:
当我们调用方法时,js会生成与之对应的执行环境(context),当一系列方法被依次调用时,其他方法会被排队在一个叫“执行栈”的地方;当这个执行环境中的代码执行完毕并返回结果后,js会退出执行环境并销毁,回到上个执行环境。反复进行直到代码全部执行完毕。

异步代码
JavaScript遇到一个异步事件后,不将这个事件挂起,继续执行其他同步代码,当异步事件返回结果时,JS会将他加入另一个队列——(事件队列)。等执行栈的所有任务执行完毕,主线程处于闲置的时候,主线程会去查找事件队列是否有任务。如果有,取第一个事件放入执行栈中,执行其中的同步代码。
而异步任务之间并不相同,他们的执行优先级有区别。不同的异步任务会被分为两类:微任务(micro task)和宏任务(macro task).
宏任务:setInterval(),setTimeout().
微任务:new promise(),new MutaionObserver();
主线程空闲的时候会先去查看微任务队列是否有事件存在,如果存在就会一次对微任务队列依次调用,直到为空。然后其宏任务队列依次执行,进入循环。
微任务永远在宏任务之前执行。
JS事件循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值