JS之执行上下文execution context

144 阅读1分钟

感谢讶羽大大的分享,想看原文移步讶羽大大的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

小结:当执行一个函数时就会创建一个执行上下文,并压入执行上下文栈中去,函数执行完毕,这个执行上下文就从栈弹出。