Event Loop

100 阅读2分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

一、JavaScript

js是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。js采用弱类型的变量类型,是一种基于对象的脚本语言。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。最主要的是它是单线程。

任务队列

线程

这里说下什么是单线程

单线程:指在程序执行时,所有的路径按照连续顺序排下来,前面的必须处理好,后面的才能继续执行 多线程:在程序执行时,多个任务可以同时执行

官方点就是,单线程就是进程中只有一个线程,多线程就是进程中有多个线程。

任务分类

在js的任务中,所有的任务可以分为两种,一种是同步任务,一种是异步任务

比如

console.log('a')
for(let i = 0; i < 10; i++) {
  console.log(i)
}
console.log('b')

上边就是同步任务,先执行a输出,按顺序执行for循环,在for循环执行完之后,再执行输出b

image.png

比如:

console.log('a')
setTimeout(()=> {
  console.log('c')
},0)
console.log('b')

image.png

下边这个异步任务

从结果上我们能看出来,尽管在定时器上的时间为0,在程序的处理上还是先将这个定时器挂起,先将宏任务执行完,才执行挂起的微任务。

异步的执行

  • 所有同步任务都在主线程上执行,形成一个执行栈。
  • 主线程之外,还有存在有任务对列(task queue)。只要异步任务有了运行结果,就在‘任务队列’中放置一个事件
  • 当‘执行栈’中所有的同步任务执行完毕,系统就回读取‘任务队列’,查看还有哪些任务,然后在等待的异步任务就会结束等待状态,进入执行栈,开始执行
  • 之后主线程不断的重复上述步骤

如下

Promise.resolve().then(() => {
  console.log('promise1');
})
setTimeout(() => {
  console.log('setTimeout1')
  Promise.resolve().then(() =>  {
    console.log('promise2');
  })
}, 0)

setTimeout(() => {
  console.log('setTimeout2')
}, 0)

在任务队列的执行结果如下:

image.png

未完待续。。。。