Skip to content

JS 中的闭包是什么

JavaScript 中, 闭包 是指在函数内部创建的函数,并且可以访问到外部函数的变量。简单来说, 闭包 是由函数以及创建该函数的词法环境组合而成的。

闭包 可以理解为一个函数和该函数所在的词法环境的组合体,词法环境是指变量和函数的定义时所处的环境。 闭包 可以访问外部函数的变量,即使外部函数已经执行完毕,这是因为 闭包 保留了对外部函数词法环境的引用。

闭包 的一个常见应用是在函数内部创建私有变量。通过使用 闭包 ,可以在函数内部定义变量,并且只能通过内部函数来访问和修改这些变量,从而实现了私有变量的效果。

js
function outerFunction() {
  var outerVariable = 'Hello'

  function innerFunction() {
    console.log(outerVariable)
  }

  return innerFunction
}

var closure = outerFunction()
closure() // 输出 'Hello'

在上面的示例中,innerFunction 是一个闭包,它可以访问到外部函数 outerFunction 中的 outerVariable 变量。当调用 outerFunction 时,它返回了 innerFunction,并将其赋值给变量 closure。当调用 closure 时,它仍然可以访问到 outerVariable 的值,并输出结果为 'Hello'。这是因为闭包保留了对外部函数词法环境的引用,即使外部函数已经执行完毕。

场景

  • 实现私有变量和私有函数:通过使用 闭包 ,可以在函数内部创建变量和函数,并且只能通过内部函数来访问和修改这些变量,从而实现了私有变量和私有函数的效果。这样可以避免全局命名空间的污染和变量的意外修改。

  • 保存函数的状态闭包 可以保存函数的状态,即使函数已经执行完毕。通过在 闭包 中保存变量的引用,可以在函数执行后继续访问和修改这些变量。这对于一些需要记住状态的场景非常有用,例如计数器、缓存等。

  • 创建函数工厂闭包 可以用于创建函数工厂,即根据不同的参数返回不同的函数。通过在 闭包 中保存参数的引用,可以在返回的函数中使用这些参数,从而实现了函数的定制化。

  • 实现模块化:通过使用 闭包 ,可以将相关的变量和函数封装在一个函数内部,从而实现模块化的效果。这样可以减少全局变量的使用,提高代码的可维护性和可复用性。

需要注意的是,闭包 在使用不当的情况下可能会导致内存泄漏,因为 闭包 会持有对外部变量的引用,导致这些变量无法被垃圾回收。因此,在使用 闭包 时需要注意内存管理,并及时释放不再需要的 闭包

注意点

在现代的 JavaScript 中,闭包 的很多场景已经消失了,比如模块化。