美文网首页
JScript执行上下文栈execution Context S

JScript执行上下文栈execution Context S

作者: 张先觉 | 来源:发表于2020-07-08 09:09 被阅读0次

#执行上下文栈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 = [
    
];

相关文章

网友评论

      本文标题:JScript执行上下文栈execution Context S

      本文链接:https://www.haomeiwen.com/subject/kdkqcktx.html