什么是作用域
作用域指的是程序中变量、函数或其他标识符的可见性和可访问性的范围。
作用域的分类
1. 全局作用域
- 定义: 在任何函数或代码块之外定义的变量。
- 特点: 在程序任何地方都能访问,但滥用全局变量容易造成命名冲突和难以维护。
- 示例:
let globalVar = '我是全局的'
function foo() {
console.log(globalVar) // 可以访问
}
console.log(globalVar) // 可以访问
2. 局部作用域
- 定义: 在任何函数里面定义的变量。
- 特点: 只能在函数内部访问。函数执行完后,其内部变量通常会被销毁。
- 示例:
function foo() {
let a = '我是函数内部的'
console.log(a) // 可以访问
}
test()
console.log(a) // 访问失败
3. 块级作用域
- 定义: 由一对花括号{}定义的区域,比如if,for,while
- 特点: 只能在定义的块里面使用
- 示例:
if (true) {
let blockVar = '我在块里'
const constVar = '我也在块里'
console.log(blockVar) // 可以访问
}
console.log(blockVar) // 报错!blockVar 未定义
// 使用 var 则没有块级作用域
if (true) {
var oldVar = '我是 var 声明的'
}
console.log(oldVar) // 可以访问!var 只有函数作用域
为什么要有作用域
-
避免变量名冲突: 你可以在不同函数里定义相同的变量名(i,temp),他们不会互相影响
-
增强安全性与封装性:私有数据(如函数内的局部变量)不会意外暴露给外部代码。
-
优化内存管理:变量在离开作用域后可以被垃圾回收,释放内存。
-
构成闭包的基础:理解作用域链是理解闭包(函数能够“记住”并访问其词法作用域)的关键。