Js事件循环机制EventLoop

Js事件循环机制EventLoop

js特点为单线程、但通过事件循环机制配合回调函数实现异步多线程的效果

事件循环机制三个关键

调用栈: 执行主线程代码

消息队列:执行fetch、setTimeout、setInterval的异步代码

微任务队列:执行promise、async、await的异步代码

宏任务与微任务:

宏任务:(macro)task,由宿主发起、可以理解是每次调用栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。

宏任务包含:

script(整体代码)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)

微任务:由JavaScript自身发起的任务、可以理解是在当前宏任务执行结束后立即执行的任务

微任务包含:

Promise.then
Object.observe
MutationObserver
process.nextTick(Node.js 环境)

执行顺序:

1、调用栈(宏任务执行)

2、微任务队列(调用栈加入的微任务会立马执行、但其异步操作会在微任务队列中、待调用栈清空后执行)

3、消息队列(待调用栈、微任务队列清空执行)

代码测试

    
	let p = new Promise(resolve => {// 此处为 调用栈加入的微任务会立马执行
        console.log(4) // 此处会立马执行
        resolve(5) // 此处会立马执行、但此处异步操作会放入微任务队列、待调用栈清空执行
    })
    function  f1() {
        console.log(1) 
    }
    function f2() {
        setTimeout(()=>{
            console.log(2)// 处异步操作会放入消息队列、待调用栈清空执行
        },0)
        f1()
        console.log(3)
        p.then(result =>{ 
            console.log(result)
        })
    }
    f2()

答案

4 1 3 5 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值