在学习Javascript的过程中,上下文和作用域是两个非常重要的概念。本文将从深度和学习的角度,详细解释这两个概念,并提供示例代码以帮助读者更好地理解。
上下文
在Javascript中,上下文是指代码执行时所处的环境。通俗地说,就是代码执行时所处的“场景”。Javascript中有三种上下文:
全局上下文:全局上下文是Javascript代码执行的默认上下文。当代码首次执行时,就会自动创建一个全局上下文。全局上下文对应着全局对象
window
,所有在全局上下文中声明的变量和函数都会成为全局对象的属性和方法。函数上下文:每当一个函数被调用时,就会创建一个新的函数上下文。函数上下文被用来保存函数内部的变量、函数参数和this值等信息。
eval
上下文:在eval()
函数中执行的代码会创建一个新的上下文,称之为eval
上下文。eval
上下文可以访问周围的作用域,但是不能访问全局对象。
作用域
作用域是指一个变量或函数可以被访问的范围。在Javascript中,有两种作用域:
- 全局作用域:全局作用域中定义的变量和函数可以在任何地方被访问。全局作用域是指在所有函数之外声明的变量和函数。
// 全局作用域 var globalVariable = "This is a global variable."; function globalFunction() { console.log("This is a global function."); }
- 函数作用域:在函数内部声明的变量和函数只能在函数内部被访问。这种作用域称之为函数作用域。
function foo() { // 函数作用域 var localVariable = "This is a local variable."; function localFunction() { console.log("This is a local function."); } }
作用域链
当Javascript代码执行时,会创建一个称为作用域链的数据结构。作用域链由多个不同的执行上下文对象组成,每个执行上下文对象都有一个指向它的父级执行上下文对象的引用。该链从当前执行上下文对象一直到全局执行上下文对象。
在访问某个变量或函数时,Javascript引擎会首先在当前执行上下文中查找该变量或函数,如果没有找到,则会继续在父级执行上下文中查找,直到找到全局作用域为止。这种查找方式就是作用域链。
示例代码
-- -------------------- ---- ------- -- ----- --- -------------- - ----- -- - ------ ----------- -------- --------------- - -- ----- --- ------------- - ----- -- -- ----- ----------- -------- --------------- - -- ----- --- ------------- - ----- -- -- ----- ----------- ---------------------------- -- -------- -- - ------ ---------- --------------------------- -- -------- -- -- ----- ---------- --------------------------- -- -------- -- -- ----- ---------- - ---------------- - ----------------
在上面的示例代码中,我们定义了一个全局变量globalVariable
、一个外部函数outerFunction
和一个内部函数innerFunction
。当执行outerFunction()
时,会创建一个新的函数上下文和一个新的作用域链。当执行innerFunction()
时,又会创建一个新的函数上下文和一个新的作用域链。最后,当
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/2113