上下文和执行上下文
在 JavaScript 中,“执行上下文(Execution Context)”和“上下文(Context)”通常指的是不同的概念,尽管它们之间有联系,但并非完全相同。
-
执行上下文: 这是 JavaScript 引擎内部用来管理代码执行的抽象概念,包括全局执行上下文和函数执行上下文。执行上下文跟踪代码的执行位置,管理变量、作用域、this 指向等信息。
-
上下文:在 JavaScript 中常常指的是函数的执行环境,包括了函数的作用域、闭包、this 指向等。在更广泛的语境下,“上下文”也可以用来指代代码执行时所处的环境或背景。
虽然两个术语在某种程度上有联系,但“执行上下文”更专注于 JavaScript 引擎内部的执行机制和环境管理,而“上下文”则更广泛,可能包含更多方面的信息,例如执行环境、作用域链、this 指向以及其他与代码执行相关的信息。
因此,虽然这两个术语在某些情况下可以互换使用,但它们在 JavaScript 中的含义和应用场景略有不同。
上下文
在JavaScript中,“上下文”(context)是一个广泛用于描述代码执行时所处的环境的术语。通俗地说,上下文是指代码被执行时所在的情境或背景。
JavaScript中的上下文可以分为两种主要类型:
全局上下文(Global Context): 这是代码执行的默认上下文,它在整个代码中都是可访问的。当你运行一个JavaScript程序时,就会创建一个全局上下文。
函数上下文(Function Context): 每当你调用一个函数时,都会创建一个新的函数上下文。函数上下文与全局上下文不同,它只在函数被调用时存在,并在函数执行完毕后被销毁。
上下文包含了一些关键信息,包括变量、函数、this等。在函数上下文中,this引用的是调用该函数的对象。在全局上下文中,this通常指向全局对象(在浏览器中是window对象)。
执行上下文
执行上下文(Execution Context)是在 JavaScript 中管理和执行代码的抽象概念。每当代码在 JavaScript 引擎中执行时,都会创建一个执行上下文来管理变量、函数声明、作用域链以及代码的执行顺序。
执行上下文可以分为三种类型:
-
全局执行上下文(Global Execution Context): 当代码开始执行时,会首先创建全局执行上下文。全局上下文是代码执行的默认环境,它会在整个页面生存周期内存在。在浏览器中,全局执行上下文通常代表整个窗口对象(Window 对象)。
-
函数执行上下文(Function Execution Context): 每当调用一个函数时,会为该函数创建一个对应的函数执行上下文。每个函数都有自己的执行上下文,其中包含了函数的参数、局部变量以及函数内部的作用域链。
-
评估/调用栈上下文(Eval/Call Stack Context): 这种上下文是在代码执行过程中被动态创建和销毁的。当函数被调用时,其对应的执行上下文被推入调用栈(Call Stack),在函数执行完毕后,执行上下文会从调用栈中弹出。
执行上下文包含了以下重要信息:
- 变量对象(Variable Object): 用于存储函数内的变量、函数声明和形参。
- 作用域链(Scope Chain): 决定了函数对变量和函数的访问权限,它由当前函数的变量对象和所有父级函数的变量对象组成。
- this 指向: 指示当前执行代码的上下文对象,它的值取决于函数的调用方式。