本文章是听了b站pink老师的JS所做的笔记,仅作为本人笔记
一、同步异步
1.同步:同步任务都在主线程上执行,形成一个执行栈
2.异步:JS中的异步操作是由回调函数完成的 JS中将回调函数当异步任务处理。
一般而言,异步任务有以下3种类型
1. 普通事件click、resize等
2. 资源加载,如load、error等
3. 定时器,包括setInterval、setTimeout等
异步任务相关的回调函数会被添加到任务队列中(消息队列)
二、单个异步任务执行详解
1.执行顺序
1.先执行执行栈中的同步任务
2. 异步任务(回调函数)放入任务队列中
3.一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,
于是被读取的异步任务结束等待状态,进入执行栈,开始
2.示例代码
console.log(1)
setTimeout(function () {
console.log(3)
},0)
console.log(2)
3.输出结果
输出:1 2 3
4.示例图形

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)
document.addEventListener('click',function () {
console.log('click')
})
console.log(2)
setTimeout(function () {
console.log("定时器")
},2000)
2.输出结果
1.在setTimeout定时之前点击文档:1 2 click 定时器
2.在setTimeout定时之后点击文档:1 2 定时器 click
3.原理图

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