JS执行机制

JavaScript 执行机制

JS是单线程的,JS是通过事件队列(Event Loop)的方式来实现异步回调的

一、进程和线程

  1. 进程:是CPU资源分配的最小单位,进程之间相互独立,任意时刻,CPU总是运行一个进程(工厂)
  2. 线程:是CPU调度的最小单位(工人)
    一个进程中可以有多个线程

每个应用程序都是一个进程,浏览器就是多进程的,每个Tab页,就是一个独立的进程


二、执行和运行

  1. 执行:一般依赖于环境,比如node浏览器等。JavaScript在不同环境下的执行机制可能并不相同
    (Event Loop是JavaScript的一种执行方式)
  2. 运行:是指JavaScript的解析引擎,是统一的

三、任务队列

  1. task就是任务,每一个语句就是一个任务
  2. queue就是FIFO的队列(First Input First Output的缩写,先入先出队列)
  3. TaskQueue就是承载任务的队列,而JavaScript的EventLoop就是会不断的过来找这个queue,问有没有task可以运行

四、同步任务和异步任务

  1. 同步任务:主线程来执行的时候立即就能执行的代码
  2. 异步任务:主线程执行到这个task的时候,“唉,你等会,我现在先不执行,等我xxx完了以后我再来等你执行”。意思就是你先去执行憋得task,等我这xxx完之后再往TaskQueue里面塞一个task的同步任务等待被执行。

五、Event Loop

JavaScript有一个主线程(main thread)和调用栈(call-tack)也称之为执行栈。所有任务都会放到调用栈等待主线程来执行

  1. 主线程自上而下执行所有代码
  2. 同步任务直接进入到主线程被执行,而异步任务则进入到Event Table并注册相应的回调函数
  3. 异步任务完成后,Event Table会将这个函数移入到Event Queue
  4. 主线程任务执行完了以后,会从Event Queue中读取任务,进入到主线程去执行,如果TaskQueue中没有任务执行,主线程就一直在这等着
  5. 循环如上

六、宏任务(MacroTask)和微任务(MicroTask)

  1. 宏任务:所有同步任务代码都是MacroTask(不严谨),setTImeout、setInterval、I/O等都是宏任务
  2. 微任务:process.nextTick、Promise.then catch finally、MutationObserver除了这几个,其他的同步都是宏任务

参考资料

https://mp.weixin.qq.com/s/Jj1TPz1aKyke1kjb5x8dNQ

  • © 2020 哇哇