这里写自定义目录标题
JavaScript的执行上下文
第一遍翻红宝书,读到执行上下文这一块时觉得十分生涩难懂,一直卡在上下文这几个字眼导致后面的变量对象,作用域链已经this指向问题都是一知半解的状态,今天读第二遍才彻底弄懂这个东西,所以想把它记录下来,日后还有疑惑可以回来看看。
执行上下文是什么?
在一个JavaScript程序中,执行上下文决定了函数的执行顺序,当JavaScript控制器转到可执行代码的时候,就会进入一个执行上下文。执行上下文可以把它看作是代码的运行环境,我个人觉得把它当作用域会更容易理解,
JavaScript的执行上下文主要可以分为三个情况:
- 全局上下文 ,js程序执行首先会进入的环境;
- 函数上下文,每当一个函数执行的时候,会创建它的执行上下文,实际上就是函数内的作用域;
- eval(很少使用了~)
JavaScript的执行顺序
一个JavaScript程序执行下来,会产生多个执行上下文,它们决定了代码该如何执行,何时执行。首先,代码开始执行时,JavaScript会以栈的形式来处理这些执行上下文,这个栈也可以成为函数调用栈,因为除去全局上下文以外都是函数的上下文,栈底永远是全局上下文,栈顶则永远是正在执行的函数上下文。
当代码执行时,首先全局上下文会进入栈底,随后继续执行,当执行到函数调用时,会创建该函数的执行上下文。若函数中有其他函数调用,则往栈顶继续添加其他函数的执行上下文,当函数执行完毕后,会弹出栈顶,下面举个例子说明。
首先看执行环境,全局上下文入栈。
全局上下文入栈以后,其他代码开始执行,先执行到getAge函数,JavaScript会创建getAge函数的执行上下文,并压入函数调用栈的栈顶。
随后,再getAge函数中又调用了getName函数,同理会创建getName的执行上下文,并压入栈顶。
若getName函数中没有其他函数调用,则getName执行完毕后,该函数的上下文出栈,
若getAge函数内部没有其他函数调用,则getAge函数执行完毕后其上下文出栈。
继续执行其他代码,若没有遇到函数执行,则执行完所有代码。当浏览器关闭之后,全局上下文出栈,至此函数调用栈被彻底清空。要注意若函数中又return,则会直接将该函数的上下文弹出。
总结
1 JavaScript的函数执行顺序是靠执行上下文决定的,即每次都是栈顶的函数上下文先执行,接着依次向下,单线程执行。
2 全局上下文有且只有唯一一个,当浏览器关闭时出栈。
3 函数的执行上下文没有数量限制。
4 函数的执行上下文在其调用时创建,而不是在函数定义时。