JS 执行机制

118 阅读3分钟
    本文章是听了b站pink老师的JS所做的笔记,仅作为本人笔记

一、同步异步

1.同步:同步任务都在主线程上执行,形成一个执行栈
2.异步:JS中的异步操作是由回调函数完成的 JS中将回调函数当异步任务处理。
    一般而言,异步任务有以下3种类型
    1.  普通事件click、resize等
    2.  资源加载,如load、error等
    3.  定时器,包括setIntervalsetTimeout等
    异步任务相关的回调函数会被添加到任务队列中(消息队列)

二、单个异步任务执行详解

1.执行顺序
   1.先执行执行栈中的同步任务

   2. 异步任务(回调函数)放入任务队列中

   3.一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,
   于是被读取的异步任务结束等待状态,进入执行栈,开始

2.示例代码
    console.log(1)
    setTimeout(function () {
        console.log(3)
    },0)
    console.log(2)
3.输出结果
    输出:1 2 3
4.示例图形

image.png

5.执行过程
    1. 首先按顺序 执行console.log(1) 打印出了1
    
    2. 然后执行setTimeout(fn,0) 但是在这里fn是回调函数 JS将回调函数当异步任务处理,所以将fn 加入到任务队列,但是不执行
    
    3. 继续执行console.log(2) 打印出2 此时所有的同步任务都已经执行完成

    4. 系统读取任务队列中的fn,该任务结束等待,进入执行栈,并开始执行fn

    打印出 3

三、多个异步任务执行详解

1.示例代码
    console.log(1)

    //1.第一个异步任务
    document.addEventListener('click',function () {
        console.log('click')
    })
    console.log(2)

    //2.第二个异步任务
    setTimeout(function () {
        console.log("定时器")
    },2000)
2.输出结果
    1.setTimeout定时之前点击文档:1 2 click 定时器
    
    2.setTimeout定时之后点击文档:1 2 定时器 click
3.原理图

image.png

4.执行过程
1.      首先按顺序执行console.log(1) 打印出1

2.      然后document.addEventListener(‘click’,function(console.log(‘click’)))中click
        是回调函数当作异步任务处理,将fn转移到异步进程处理,只要单击屏幕则将其转入任务队列

3.      继续执行console.log(2) 打印出2

4.      继续执行setTimeout(fn,2000) 回调函数当作异步任务处理,转入异步进程处理,

5.      此时所有的同步任务都已经执行完成,接下来就看异步进程处理中按键如果点击,
        则将function(){console.log(‘click’)}转移到任务队列,因为同步任务执行完成,
        所以同步任务会查找任务队列到准备好的function(){console.log(‘click’)}执行它,输出click

6.      setTimeout里的回调函数同理,两者执行顺序在于谁先准备好。

7.      执行栈会一直扫描任务队列是否有准备的任务,有就转移到执行栈,这种过程成为事件循环。