JavaScript中的作用域链和闭包


在JavaScript中,作用域链(Scope Chain)和闭包(Closure)是两个核心概念,它们对理解JavaScript的变量查找机制以及函数的行为方式至关重要。

### 作用域链

作用域链是JavaScript在查找变量时的一种机制。当函数被创建时,它会记住自己被创建时的作用域(也就是所谓的“词法作用域”),这包括全局作用域和所有父级作用域。当函数执行时,如果尝试访问某个变量,JavaScript会首先在当前作用域中查找该变量。如果没有找到,它会继续沿着作用域链向上查找,直到找到该变量或到达全局作用域为止。如果最终在全局作用域中也没有找到该变量,那么就会抛出一个引用错误(ReferenceError)。

### 闭包

闭包是JavaScript中另一个强大的特性,它允许一个函数访问并操作函数外部的变量。闭包的形成通常涉及到嵌套函数,内部函数能够记住并访问其外部函数的变量,即使外部函数已经执行完毕。这是因为内部函数的作用域链中包含了外部函数的作用域。闭包允许数据隐私,模块化和创建封装的数据结构。

### 示例代码

下面是一个简单的闭包示例,展示了如何通过闭包访问外部函数的变量:


function createCounter() {
  let count = 0; // 外部函数的变量
  return function() { // 返回一个内部函数
    count = count + 1; // 内部函数访问并修改外部函数的变量
    return count;
  }
}

let counter = createCounter(); // 创建闭包
console.log(counter()); // 输出: 1
console.log(counter()); // 输出: 2

在这个例子中,`createCounter` 函数返回了一个内部函数,该内部函数通过闭包记住了 `count` 变量的值,即使 `createCounter` 函数已经执行完毕。这样,我们就可以通过调用 `counter()` 函数来递增并获取 `count` 的值。