是什么?
JavaScript执行上下文是指JavaScript代码在运行时的执行环境和存储机制。每当JavaScript代码执行时,都会创建一个执行上下文,并且这些上下文以栈的形式进行管理。
执行上下文包括三个重要的组成部分:
- 变量对象(Variable Object):存储变量、函数声明和函数的形参等信息。在执行上下文创建时,会先创建一个变量对象。
- 作用域链(Scope Chain):存储了所有父级作用域的变量对象的集合。它决定了变量和函数的访问权限。
- this指向:this是一个特殊的对象,它指向当前执行上下文所属的对象。
当JavaScript代码开始执行时,首先会创建一个全局执行上下文,该上下文是最外层的上下文。之后,每当一个函数被调用,都会创建一个新的执行上下文,并且被推入执行上下文栈中。当函数执行完成后,对应的执行上下文会从栈中弹出。
当访问变量或函数时,JavaScript引擎会通过作用域链进行查找。它会先在当前的变量对象中查找,如果找不到,就会往上一级作用域链中的变量对象中查找,直到找到对应的变量或抵达全局作用域为止。
总结来说,执行上下文是JavaScript中管理作用域、变量和函数调用的机制,它提供了一种封装和管理代码的方式,并且决定了代码的执行顺序和访问权限。
例子
var globalVariable = "Global"; // 全局变量
function outerFunction() {
var outerVariable = "Outer"; // 外部函数的局部变量
function innerFunction() {
var innerVariable = "Inner"; // 内部函数的局部变量
console.log(innerVariable); // 输出: Inner
console.log(outerVariable); // 输出: Outer
console.log(globalVariable); // 输出: Global
}
innerFunction(); // 调用内部函数
}
outerFunction(); // 调用外部函数
当代码执行时,首先创建了全局执行上下文。在这个执行上下文中,会创建一个变量对象,其中包含了全局变量globalVariable
。然后,outerFunction
被调用,创建了一个outerFunction
执行上下文。在这个执行上下文中,会创建一个变量对象,其中包含了局部变量outerVariable
。接着,innerFunction
被调用,创建了一个innerFunction
执行上下文。在这个执行上下文中,会创建一个变量对象,其中包含了局部变量innerVariable
。
当内部函数innerFunction
中的console.log
语句执行时,JavaScript引擎会先在当前执行上下文的变量对象中查找对应的变量。如果找到了,就输出变量的值;如果找不到,就沿着作用域链往上一级的执行上下文中的变量对象中查找,直到找到对应的变量或抵达全局作用域。