Appearance
执行上下文栈
本节目标:理解“执行上下文栈”的核心思路,并能把它用于实际开发或面试表达。
说明:原 OneNote 中有图片引用,但图片未包含在导出目录中;本页保留了可用的文字与代码内容。
**分类**
可执行代码分为下面三种:全局执行代码,在执行所有代码前,解析创建全局执行上下文。
函数执行代码,执行函数前,解析创建函数执行上下文。eval执行代码,运行于当前执行上下文中。**作用**
执行上下文定义了变量或函数有权访问的其他数据。**组成**
每一个执行上下文都由以下三个属性组成。变量对象(Variable object,VO)作用域链(Scope chain)this**执行上下文栈**
JavaScript 引擎创建了执行上下文栈(Execution context stack,ECS)来管理执行上下文。看下例了解执行上下文压栈是如何工作的。
var a = "global var";
function foo() {
console.log(a);
}
function outerFunc() {
var b = "var in outerFunc";
console.log(b);
function innerFunc() {
var c = "var in innerFunc";
console.log(c);
foo();
}
innerFunc();
}
outerFunc();
==代码首先进入====Global Execution Context====,然后依次进入====outerFunc====,====innerFunc====和====foo====的执行上下文,执行上下文栈就可以表示为:====JavaScript== ==开始要解释执行代码的时候,最先遇到的就是全局代码,所以== ==JavaScript== ==引擎会先解析创建全局执行上下文,然后将全局执行上下文压栈。然后当执行流进入一个函数时,会先解析创建函数的执行上下文,然后将它的执行上下文压栈。而在函数执行之后,会将其执行上下文弹栈,弹栈后执行上下文中所有的数据都会被销毁,然后把控制权返回给之前的执行上下文。== ==创建上下文,压栈,执行代码,执行完后弹栈,销毁当前上下文数据,转交执行权给上一个执行上下文;== ==碰到函数时,创建函数上下文,压栈,执行代码,执行完后弹栈,销毁当前上下文数据,转交执行权;== ==注意,全局执行上下文会一直留在栈底,直到整个应用结束。==
