感谢讶羽大大的分享,想看原文移步讶羽大大的GitHub
执行上下文
当执行一个函数时,就会产生执行上下文。
这和作用域不一样。
作用域是函数定义的时候就有了。
执行上下文栈ECS
看这段代码:
function fun3() {
console.log('fun3')
}
function fun2() {
fun3();
}
function fun1() {
fun2();
}
fun1();
我们用一个数组表示执行上下文栈ECS:ECStack = []
首先是全局代码,所以ECS最底部永远都有一个全局执行上下文。
现在看上面的代码:
// 伪代码
// fun1()
ECStack.push(<fun1> functionContext);
// fun1中竟然调用了fun2,还要创建fun2的执行上下文
ECStack.push(<fun2> functionContext);
// 擦,fun2还调用了fun3!
ECStack.push(<fun3> functionContext);
// fun3执行完毕
ECStack.pop();
// fun2执行完毕
ECStack.pop();
// fun1执行完毕
ECStack.pop();
// javascript接着执行下面的代码,但是ECStack底层永远有个globalContext
小结:当执行一个函数时就会创建一个执行上下文,并压入执行上下文栈中去,函数执行完毕,这个执行上下文就从栈弹出。