#执行上下文栈execution context stack:
JavaScript引擎并非一行一行地分析和执行程序,而是一段一段地分析执行。当执行一段代码的时候,会进行一个“准备工作”,即“执行上下文(execution context)”。
至于JavaScript可执行代码的类型一共有三种:全局代码、函数代码、eval代码。即遇见这三种类型的代码,便会创立一个执行上下文,压入Stack里面,等待执行。
所以,JavaScript 引擎创建了执行上下文栈(Execution context stack,ECStack)来管理执行上下文。
#工作原理:
当JavaScript遇见可执行代码,就会创立执行上下文,同时,压入执行上下文栈中。等待执行之后,执行上下文就会从栈中弹出。
function fun3() {
console.log('fun3')
}
function fun2() {
fun3();
}
function fun1() {
fun2();
}
fun1();
// 分析以上代码(执行上下文栈ECStack、全局代码globalContext)
第一阶段:当 JavaScript 开始要解释执行代码的时候,最先遇到的永远是全局代码globalContext ,率先被压入执行上下文栈。
ECStack = [
globalContext
];
第二阶段:解析执行函数
// fun1() => 要执行fun1了,创建fun1的执行上下文
ECStack.push(<fun1> functionContext);
// fun1执行途中,发现竟然调用了fun2,于是,创建fun2的执行上下文,优先执行fun2
ECStack.push(<fun2> functionContext);
// 擦,fun2还调用了fun3!于是,创建fun3的执行上下文,优先执行fun3
ECStack.push(<fun3> functionContext);
ECStack = [
<fun3> functionContext,
<fun2> functionContext,
<fun1> functionContext
globalContext
];
// fun3执行完毕
ECStack.pop();
// fun2执行完毕
ECStack.pop();
// fun1执行完毕
ECStack.pop();
// javascript接着执行下面的代码,但是ECStack底层永远有个globalContext
最后阶段:代码执行完毕,执行上下文栈被清空。
ECStack = [
];
网友评论