JS执行上下文
在JavaScript中,执行上下文是一个抽象的概念,用来描述代码被执行时的环境和条件。每次 JavaScript 代码执行,都会创建一个新的执行上下文。执行上下文可以分为三种类型:全局执行上下文、函数执行上下文和 eval 执行上下文。
全局执行上下文
全局执行上下文是代码中默认的执行上下文,当 JavaScript 代码在全局范围内执行时,会创建全局执行上下文。在全局执行上下文中,this 的值指向全局对象,在浏览器环境中为 window 对象。
全局执行上下文中的变量和函数都属于全局作用域,可以被当前代码中的任何其他执行上下文访问。
// 全局执行上下文中的变量
var a = 1;
// 全局执行上下文中的函数
function greet() {
console.log("Hello World!");
}
console.log(a); // 输出: 1
greet(); // 输出: Hello World!
函数执行上下文
当函数被调用时,会创建一个新的函数执行上下文。函数执行上下文在函数作用域内生效,函数内定义的变量和函数只能在该函数执行上下文中访问。
函数执行上下文包含了函数内部的变量、函数参数、this 指向等信息。当函数执行完毕后,其执行上下文会被销毁,函数内部的变量也会被释放。
// 函数执行上下文中的变量
function multiply(a, b) {
var result = a * b;
console.log(result);
}
multiply(2, 3); // 输出: 6
// result 变量仅在 multiply 函数执行上下文中有效
eval 执行上下文
eval 函数可以动态执行一段字符串形式的 JavaScript 代码,并将其结果返回。eval 执行上下文与全局执行上下文类似,但由于其变量和函数可以在代码执行前添加到其中,因此几乎没有局部作用域。
// eval 执行上下文中的变量
var x = 10;
function evaluateExpression(expression) {
var result = eval(expression);
console.log(result);
}
evaluateExpression("x * 2"); // 输出: 20
// result 变量仅在 evaluateExpression 函数执行上下文中有效
执行上下文的创建过程
在 JavaScript 中,每个执行上下文都有一个词法环境(Lexical Environment)和一个变量环境(Variable Environment)。词法环境保存着变量和函数的实际定义,变量环境用来处理函数声明提前和变量提升等操作。
执行上下文的创建过程如下:
- 创建词法环境 Lexical Environment
- 创建变量环境 Variable Environment
- 将当前作用域中的变量和函数定义添加到环境中
- 设置 this 指向
- 开始执行代码
var a = 10;
function foo() {
var b = 20;
function bar() {
var c = 30;
console.log(a + b + c);
}
bar();
}
foo(); // 输出: 60
在上面的代码中,当执行 foo 函数时,会创建一个新的函数执行上下文。在 bar 函数执行上下文中,a、b 和 c 变量都可以被访问,因为它们都在当前执行上下文的环境中。
总结
执行上下文是 JavaScript 中代码执行时的环境和条件。全局执行上下文在全局范围内执行,函数执行上下文在函数内部生效,而 eval 执行上下文可以动态执行字符串形式的代码。