javascript事件循环 EventLoop自我理解

本文详细介绍了JavaScript中的同步与异步执行机制,特别是事件循环和任务队列的概念。JS是单线程,但通过异步处理DOM事件、setTimeout等。异步分为宏任务和微任务,执行顺序遵循同步代码→微任务队列→宏任务队列的流程。Promise是异步处理的重要工具,其then方法中的回调属于微任务。理解这一机制对于优化JavaScript代码执行至关重要。
摘要由CSDN通过智能技术生成

javascript的同步和异步

由于javascript是同步代码,是按照代码顺序从上而下执行。但是由于一切特殊的方法,没办法用同步的机制。比如dom事件,setTimeOut,ajax这些。如果采用同步的方式,则会阻碍后面代码的执行。所以js中引入了异步的概念。

js中的异步,由于js本身是单线程,不支持多线程。但是运行js的环境(浏览器)是可以多线程运行的(就像后端php也是单线程的,但是nginx是多线程的。可以一次性处理多个php请求是一个道理)。浏览器会分配3个线程,一个是处理前端的页面渲染(html+css),一个是处理js的代码,一个是处理js的异步回调。

那js的异步代码执行的先后顺序是怎样的呢?他遵循一个什么样的机制?

这里就要讲到js的事件循环。简单的说,就浏览器会先执行所有的同步代码。然后把异步的代码放入任务队列中,等同步代码执行栈中的代码全部执行完以后,再按照任务队列中先进先出的顺序从任务队列中把异步代码拿回来执行。

这里涉及到两个概念。宏任务和微观任务。

宏任务包括setTimeout、setInterval、 setImmediate、script(整体代码)——>第一个宏任务、I/O 操作等

微任务包括,process.nextTick、Promise、MutationObserver等,主要是promise

  • 初始状态下,调用栈空。微任务队列空,宏任务队列里有且只有一个 script 脚本(整体代码)。这时首先执行并出队的就是 整体代码

  • 整体代码作为宏任务进入调用栈,进行同步任务和异步任务的区分

  • 同步任务直接执行并且在执行完之后出栈,异步任务进行微任务与宏任务的划分,分别被推入进入微任务队列宏任务队列

  • 等同步任务执行完了(调用栈为空)以后,再处理微任务队列,将微任务队列压入调用栈

  • 当调用栈中的微任务队列被处理完了(调用栈为空)之后,再将宏任务队列压入调用栈,直至调用栈再一次为空,一次轮回结束

整体的运行流程可以查看下图,红色箭头为主要的执行流程整体代码(宏任务) => 同步任务 => 微任务队列 => 宏任务队列

注:promise有些特殊。promise内部的代码属于同步代码,在执行同步代码的时候会先执行。then里面的回调函数属于微任务代码

例:

var p = new Promise(function(resolve,reject){

                                resolve();

                                console.log("同步代码执行");

}).then((ret) =>{

                console.log("微任务代码执行");

})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值