闭包是什么,有什么用途和风险

先理解原理和示例,再练习完整口述与追问。

函数保留对其词法环境的访问能力,可用于私有状态、工厂函数、防抖等。闭包本身不是内存泄漏;重点是长期存活的监听器、定时器等是否持有不再需要的对象。

闭包指函数与其创建时所处词法环境的关联。函数执行结束后,只要返回的函数还可达且仍需其中的变量,相关绑定就可以继续存在。闭包保存的是对绑定的访问能力,通常不是创建时数值的快照。因此同一作用域里的多个函数可以看到同一变量后来的变化;每次调用工厂函数又可以创建独立环境。

js
function makeCounter() {
  let count = 0
  return () => ++count
}
const a = makeCounter()
const b = makeCounter()
console.log(a(), a(), b()) // 1 2 1

a 的两次调用共享一次 makeCounter 创建的 count;b 来自另一次调用,状态独立。事件处理、私有状态和函数缓存都会使用这种能力。

闭包本身不是内存泄漏。只有已经不需要的数据仍被可达的监听器、定时器或缓存引用时,才需要断开引用;也不能靠变量赋 null 就保证所有别名都释放。

闭包是函数与其创建时词法环境的组合,即使外层函数已返回,内部函数仍可访问当时的变量。它适合保存私有状态,例如防抖函数保存 timer,或工厂函数保存独立计数。闭包本身不等于泄漏,风险是长生命周期对象一直引用不再需要的数据。排查时看事件监听、定时器和全局缓存的引用链,并在不再使用时解绑或释放。