链锁 JS 中的执行上下文
2024-01-05 07:26:57
执行上下文:链条式指令执行
当 JS 代码开始执行时,首先创建一个全局执行上下文,并将该执行上下文压入调用栈中。全局执行上下文包含全局变量对象和全局作用域链。
当遇到函数调用时,将创建该函数的执行上下文,并将该执行上下文压入调用栈中。函数执行上下文包含函数变量对象、函数作用域链和this指针。函数执行完毕后,该函数的执行上下文将从调用栈中弹出。
作用域链:链条式搜索
作用域链是一个由执行上下文组成的链。当查找变量时,会从当前执行上下文的变量对象开始搜索。如果没有找到,则会沿着作用域链向上搜索,直到找到该变量或到达全局执行上下文。作用域链可以帮助我们理解变量的访问权限。
闭包:保存执行上下文
闭包是一个可以访问其他函数内部变量的函数。闭包通过保存其创建时的执行上下文来实现此目的。这意味着闭包可以访问其创建时的局部变量,即使这些变量在创建闭包的函数执行完毕后仍然存在。闭包经常被用于事件处理和数据封装。
通俗示例:理解执行上下文
为了更清楚地理解执行上下文,让我们来看一个简单的示例:
var globalVariable = "Global";
function outerFunction() {
var outerVariable = "Outer";
function innerFunction() {
var innerVariable = "Inner";
console.log(globalVariable); // "Global"
console.log(outerVariable); // "Outer"
console.log(innerVariable); // "Inner"
}
innerFunction();
}
outerFunction();
在这个示例中,首先创建了全局执行上下文,并将全局变量对象压入调用栈中。当 outerFunction 被调用时,会创建该函数的执行上下文,并将该执行上下文压入调用栈中。outerFunction 的执行上下文包含 outerVariable 变量对象和 outer 作用域链。
当 innerFunction 被调用时,会创建该函数的执行上下文,并将该执行上下文压入调用栈中。innerFunction 的执行上下文包含 innerVariable 变量对象和 inner 作用域链。innerFunction 的作用域链包括 innerFunction 的执行上下文、outerFunction 的执行上下文和全局执行上下文。
innerFunction 执行时,会从其作用域链中查找变量。首先在 innerFunction 的变量对象中查找,如果没有找到,则沿作用域链向上搜索。在 outerFunction 的变量对象中找到 outerVariable,在全局执行上下文的变量对象中找到 globalVariable。
总结:执行上下文的关键作用
执行上下文是一个重要的概念,它定义了代码执行时的上下文环境。执行上下文主要包括变量对象、作用域链和 this 指针。闭包和作用域链是理解 JS 执行上下文的重要组成部分。通过理解这些概念,我们可以更好地理解 JS 代码的执行过程和变量的访问权限。