关于作用域

13 阅读1分钟

什么是作用域

作用域指的是程序中变量、函数或其他标识符的可见性和可访问性的范围。

作用域的分类

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 只有函数作用域

为什么要有作用域

  1. 避免变量名冲突: 你可以在不同函数里定义相同的变量名(i,temp),他们不会互相影响

  2. 增强安全性与封装性:私有数据(如函数内的局部变量)不会意外暴露给外部代码。

  3. 优化内存管理:变量在离开作用域后可以被垃圾回收,释放内存。

  4. 构成闭包的基础:理解作用域链是理解闭包(函数能够“记住”并访问其词法作用域)的关键。