JavaScript 对执行上下文的理解
什么是执行上下文
执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。
执行上下文类型:
- 全局执行上下文,
- 函数执行上下文,
- eval 函数执行上下文;
全局执行上下文:
任何不在函数内部的都是全局执行上下文,
它首先会创建一个全局的 window 对象,
并且设置 this 的值等于这个全局对象,
一个程序中只有一个全局执行上下文。
函数执行上下文:
当一个函数被调用时,就会为该函数创建一个新的执行上下文,函数的上下文可以有任意多个。
eval 函数执行上下文:
执行在 eval函数中的代码会有属于他自己的执行上下文。
执行上下文栈:
● JavaScript引擎使用执行上下文栈来管理执行上下文;
● 当JavaScript执行代码时,首先遇到全局代码,会创建一个全局执行上下文并且压入执行栈中,
每当遇到一个函数调用,就会为该函数创建一个新的执行上下文并压入栈顶,
引擎会执行位于执行上下文栈顶的函数,当函数执行完成之后,执行上下文从栈中弹出,继续执行下一个上下文。
当所有的代码都执行完毕之后,从栈中弹出全局执行上下文。
let a = 'Hello World!';
function first() {
console.log('Inside first function');
second();
console.log('Again inside first function');
}
function second() {
console.log('Inside second function');
}
first();
// 执行顺序:
// first() 函数中的代码先执行,然后调用 second(),second() 执行完毕后,再回到 first() 中继续执行剩余的代码。
创建执行上下文:
创建执行上下文有两个阶段:创建阶段和执行阶段。
-
创建阶段:
-
this绑定:
- 在全局执行上下文中,this 指向全局对象(window 对象);
- 在函数执行上下文中,this 指向取决于函数如何调用。
如果它被一个引用对象调用,那么 this 会被设置成那个对象,
否则 this 的值被设置为全局对象或者 undefined。
-
创建词法环境组件:
- 词法环境:
是一种持有标识符——变量映射的数据结构,标识符是指变量/函数名,而变量是对实际对象或原始数据的引用。 - 词法环境的内部有两个组件:
- 环境记录器: 用来储存变量个函数声明的实际位置。
- 外部环境的引用:它可以访问其父级词法环境(作用域)。
- 词法环境:
-
创建变量环境组件:
变量环境也是一个词法环境,其环境记录器持有变量声明语句在执行上下文中创建的绑定关系。
-
-
执行阶段:
此阶段会完成对变量的分配,最后执行完代码。
简单来说执行上下文就是指:
在执行一点JS代码之前,需要先解析代码。
解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用。
这一步执行完了,才开始正式的执行程序。
在一个函数执行之前,也会创建一个函数执行上下文环境,跟全局执行上下文类似,不过函数执行上下文会多出this、arguments和函数的参数。
● 全局上下文:变量定义,函数声明;
● 函数上下文:变量定义,函数声明,this,arguments。
关于词法环境:
词法环境是一种规范类型,基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。
一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成。

浙公网安备 33010602011771号