作用域(Scope)是指变量、函数、对象等标识符的可访问性,它定义了这些标识符的生命周期和在代码中的可见范围。作用域链(Scope Chain)则是在执行上下文中,用于确定如何访问不同作用域中变量的机制。
作用域(Scope)
作用域链:从当前作用域一层一层向上找一直找到全局环境
作用域决定了变量和函数在代码中的可访问性。
全局作用域:全局作用域是代码中所有不在函数内部的变量的默认作用域。在全局作用域中声明的变量和函数可以被程序中的任何部分访问。
函数作用域:函数作用域是由函数创建的,函数内部声明的变量只能被该函数内部的代码访问。函数的参数和在函数内部声明的变量都具有函数作用域。
块级作用域:ES6引入了
let
和const
关键字,允许在代码块(如if
语句、for
循环等)内声明变量,这些变量只在该代码块内部可见。这被称为块级作用域。
作用域链(Scope Chain)
作用域链是指在嵌套的作用域中,变量的查找规则。作用域链确保了 JavaScript 引擎在执行代码时,能正确地找到变量的值。作用域链的形成主要发生在函数调用时:
原理:
- 当访问一个变量时,JavaScript 引擎会首先在当前作用域中查找该变量。
- 如果在当前作用域中找不到该变量,JavaScript 引擎会沿着作用域链向上一级作用域查找,直到找到该变量或到达全局作用域。
- 如果在全局作用域中仍然找不到该变量,JavaScript 会抛出一个
ReferenceError
错误。
js
var globalVar = "Global";
function outerFunction() {
var outerVar = "Outer";
function innerFunction() {
var innerVar = "Inner";
console.log(innerVar); // 输出 "Inner"
console.log(outerVar); // 输出 "Outer" - 从外层作用域查找
console.log(globalVar); // 输出 "Global" - 从全局作用域查找
}
innerFunction();
}
outerFunction();