JS代码编译时就决定好了他能访问到的一切,这都得归功于执行上下文。
JS代码→编译→运行
什么是执行上下文?
执行上下文是基于ECMAscript实现,用于跟踪 运行中的代码 的规范策略,
在任何时候一段执行中的代码只能有一个执行上下文,
这一切都是隐式的,不可见的
执行上下文生成的时机?
当控制进入一段新的代码(即被编译)时,JS引擎为其生成一个新的执行上下文。
什么场景生成什么执行上下文
从执行上下文的实际表现来看,可以分为
>全局上下文:写在全局(global)中的代码
>函数上下文:新声明的函数中的代码
>eval上下文(过于深奥,MDN不推荐使用eval(),故不考虑)
JS的编译顺序是按照代码块顺序分段进行的,
全局对象中的代码是最先被编译的,所以全局上下文从JS代码被编译时就由引擎生成了。
之后编译函数中的代码,生成函数上下文
再其次是函数中新声明的函数...
执行栈
或者叫作调用栈
执行上下文用于 跟踪运行中的代码
执行栈则用于 跟踪执行上下文
每运行一段执行上下文中的代码,就会把该执行上下文压入执行栈,
新的执行上下文进入栈,则会停止运行旧的执行上下文,转而运行新的,
运行完成的执行上下