作用域与作用域链
1.什么是作用域
作用域是指当前执行代码对变量的访问权限,也就是这个变量可以在代码中使用的范围。
2.作用域分类
全局作用域:
任何地方都能访问到的对象拥有全局作用域,比如在全局上下文中定义的变量和函数。
var globalVar = 'I am global';function globalFunction() {console.log(globalVar);
}globalFunction(); // 输出:I am global
局部作用域:
在函数内部的就是局部作用域,又叫做函数作用域。比如当变量在函数内部使用 var
声明时,该变量只能在该函数内部访问,函数外部无法访问。
function myFunction() {var localVar = 'I am local';console.log(localVar); // 输出:I am local
}myFunction();
console.log(localVar); // ReferenceError: localVar is not defined
块级作用域:
使用 let
和 const
定义的变量在其所在的代码块(如 if 语句、循环等)内可用。
if (true) {let blockScopedVar = 'I am block scoped';console.log(blockScopedVar); // 输出:I am block scoped
}console.log(blockScopedVar); // ReferenceError: blockScopedVar is not defined
3.全局变量和局部变量
局部变量:只能在函数中访问,该函数外不可访问
全局变量:
- 函数外定义的变量
- 所有未定义直接赋值的变量自动声明为拥有全局作用域
4.作用域链
作用域链是一个在多层嵌套函数中查找变量的过程。
当在某个作用域中查找变量时,JavaScript 会首先在当前作用域中查找,如果未找到,会向上查找其父作用域,直到找到变量或者到达全局作用域为止。
作用域链的工作范围
- 当前作用域: 首先在当前函数或代码块的作用域中查找变量。
- 外部作用域: 如果在当前作用域中未找到,JavaScript 会查找该作用域的外部作用域,继续向上查找,直到找到变量或达到全局作用域。
- 全局作用域: 如果仍未找到,则返回
undefined
或抛出错误。
var globalVar = 'I am global';function outerFunction() {var outerVar = 'I am outer';function innerFunction() {var innerVar = 'I am inner';console.log(innerVar); // 输出:I am innerconsole.log(outerVar); // 输出:I am outerconsole.log(globalVar); // 输出:I am global}innerFunction();
}outerFunction();