执行上下文
执行上下文(Execution Context)是指代码被解释和执行时所处的环境,它包括了变量、函数声明、当前 this 指向等信息。在 JavaScript 中,执行上下文分为三种类型:全局执行上下文、函数执行上下文和 eval 执行上下文。每次函数调用都会创建一个新的函数执行上下文。
全局上下文是最外层的上下文就是常说的window对象,通过var定义的全局变量和函数都会成为window 对象的属性和方法
作用域链
上下文代码在执行的时候会创建变量对象的一个作用域链,作用域链决定了各级上下文中代码在访问变量和函数时的顺序,保证在函数中访问变量时能够按照定义顺序有序地访问到上层作用域中的变量,从而实现作用域的嵌套。
作用域链增强
作用域链增强是指在 JavaScript 中某些语句会导致在作用域链前端临时添加一个执行上下文,从而增强作用域链的长度和深度。这些语句包括:
with语句:with 语句可以将一个对象添加到作用域链的最前端,使得代码可以直接访问该对象的属性和方法。但是由于 with 语句容易引起变量声明的混淆,因此不建议使用。try-catch语句:try-catch 语句中的 catch 块可以创建一个新的执行上下文,该上下文包含了被捕获的异常对象,并将该上下文添加到作用域链的最前端。catch块:eval函数:eval 函数可以将一个字符串作为代码动态地执行,此时会创建一个 eval 执行上下文,并将该上下文添加到作用域链的最前端。
增强作用域链可以方便我们访问一些不在当前作用域内的变量和函数,但是也容易引发变量名冲突和安全性问题。因此,在实际开发中,应该避免过度使用这些语句,尤其是 with 语句和 eval 函数。
总结
内部上下文可以通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部上下文的任何东西,上下文之间的连接是线性的有序的
当内部上下文需要访问一个变量时,JavaScript 引擎会首先在当前函数的活动对象中查找该变量,
如果找不到,就会向上一级作用域链继续查找,直到找到该变量为止。
如果在整个作用域链中都找不到该变量,那么就会抛出 ReferenceError 异常。