定义
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,如果有任务,就执行,没有就执行下一个宏任务