JS 执行上下文

82 阅读2分钟

定义

JS代码运行时,在执行上下文中运行的

执行上下文分类

全局上下文

在整个JS脚本的生命周期内都会存在于执行堆栈的最底部,并且不会被栈弹出销毁

全局上下文会生成一个全局对象(浏览器环境,全局对象就是window),并且将this值绑定到这个全局对象上

函数上下文

函数被调用时,会创建一个新的函数执行上下文

Eval函数上下文

执行eval函数内部的代码也会有属于自己的执行上下文

JS任务

js中,任务分为同步任务和异步任务

  • 同步任务:主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务

  • 异步任务:不会进入主线程、而进入“任务队列”的任务(任务队列中的任务与主线程并列执行),只有当主线程空闲了并且“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

事件循环(Event Loop)

  • 同步任务、异步任务分别进入不同的执行“场所”,同步进入主线程,异步任务进入Event Table并注册函数
  • 当指定的事情完成时,Event Table会将这个函数移入Event Queue.Event Queue是队列数据结构,满足先进先出规则
  • 主线程内的任务执行完后,会去Event Queue读取对应的函数,进入主线程执行

异步任务中宏任务、微任务的执行顺序

  • 首先,整体的script开始执行时,会把所有代码分为同步任务、异步任务,同步任务会直接进入主线程依次执行,异步任务会进入异步队列然后再分为宏任务、微任务
  • 宏任务进入到Event Table中,并在里面注册回调函数,每当指定的事件完成时,Ev net Table会将这个函数移到Event Queue
  • 微任务会进入到另一个Event Table中,并在里面注册回调函数,每当指定的事件完成时,Event Table会将这个函数移到Event Queue
  • 当主线程内的任务执行完毕,主线程为空时,会检查微任务的Event Queue,如果有任务,就执行,没有就执行下一个宏任务