快速导航
执行上下文
什么是执行上下文
执行上下文就是可执行代码在执行前对当前可执行代码的一些环境的配置,如:this指向,词法环境,变量环境等生成。
可执行代码
上面提到可执行代码,估计大家都会有疑惑:我每天写的代码不都是可执行的吗?难道每行代码都有一个全局上下文? 其实不是的。
因为JS引擎在执行不是以行为单位执行的,而是以段为单位进行执行。所以在运行程序时,JS引擎会将代码分成一段一段的进行执行。这里面的每一段便是可执行代码。
可执行代码分为三种:全局代码、函数代码以及eval函数。
因此执行上下文也有三种:
-
全局执行上下文:创建一个全局对象(浏览器下是window,node下是global)。this指向全局对象,一个程序只会有一个全局对象。
-
函数执行上下文:函数会在
调用时会创建一个该函数的执行上下文,每个函数都会有自己的执行上下文,函数的上下文可以有多个,this指向根据函数调用确定。 -
eval函数执行上下文:
调用eval函数时,JS引擎也会为eval函数内部代码创建属于他们的执行上下文。如果eval直接调用this会指向内部函数,非直接调用时,跟普通函数一样。
注:eval函数虽然功能强大,但有一定的安全风险,所以请少用。
注意:函数执行上下文一定是在调用的时候才生成
执行栈
上面我们大致的讲了下执行上下文及执行上下文的种类,接下来讲讲执行栈。
首先为什么要有执行栈?答案是为了方便管理上面可执行代码的执行顺序。
在上面执行上下文中,我们发现了JS引擎是分段执行的,每一个段都有至少有一个执行上下文,那么这么多执行上下文,如何保证程序执行的时候,每一个段都准确对应他的执行上下文,而不发生混乱。为此JS引擎有了一个栈(FILO),这个栈就是执行栈。
那么执行栈是如何工作的呢? 当我们执行程序的时候。
首先遇到的便是全局代码,因此首先便是创建一个全局执行上下文,压入执行栈底。
然后遇到函数调用,便为该函数创建一个函数可执行上下文压入执行栈,遇到eval函数调用便创建一个eval函数执行上下文压入执行栈。当函数执行完毕,就会将该函数的执行上下文从执行栈里弹出,并销毁。因此全局上下文总是在程序执行完之后才才从执行栈弹出,执行栈也是在程序执行完之后才清空。
总结
本文主要就执行上下文的定义及种类,以及执行上下文的管理--执行栈做了简单讲述。执行上下文在日常工作中会主动用到的也不多,但了解之后能够减少你对于函数执行的一些迷惑。
最后内容难免出错,欢迎指正,交流