聊聊javascript的执行上下文
首先我们需要知道什么是执行上下文(Excution Context):
当代码运行时,会产生一个对应的执行环境,在这个环境中,所有变量会被事先提出来(变量提升),有的直接赋值,有的为默认值 undefined,代码从上往下开始执行,就叫做执行上下文。(复制一位老哥的话),但是简单理解JS 为执行代码的时候准备的所有东西,比如作用域,作用域链,变量,参数等这些东西;有了这些东西执行程序才不会错。然后会把这个执行上下文放入到执行环境栈(Execution Contetxt Stack)当中等待执行(不懂栈这个数据结构的小伙伴可以谷歌下,其实就是先进后出)。
接下来我们看看执行上下文的执行栈的过程:
JS 在执行代码之前都会立刻创建一个全局的执行上下文 Global Excution Context,然后把这个全局执行上下文压入执行环境栈当中
看下面这段代码function a () { console.log('a')}
function b () {
c()
console.log('b')
}
function c () {
d()
console.log('c')
}
function d () {
console.log('d')
}
a() //打印a
//代码进入执行a函数的时候.在函数内的代码执行之前,会立刻创建一个a函数的执行上下文,a Excution Context,立即把这个执行环境压入到执行环境栈中ecs
//a函数执行完成以后,从执行环境栈中弹出a的执行上下文。
b() //打印d,c,b
b函数执行之前,创建b的执行上下文,然后压入到执行,因为b里面调用了c函数,在c函数执行之前创建了一个c的执行上下文,并压入到执行环境栈中(ecs)。最后c函数又调用了d函数,
创建d函数的执行上下文,压入到执行环境栈中(ec)
d函数执行完成以后弹出d的执行上下文,然后c执行完成以后,弹出c的ec,最后再执行b函数之后,弹出b的ec,所有顺序是d,c,b
可以画图表示:
![]()
下图表示了执行环境栈的变化:



浙公网安备 33010602011771号