返回知识详解
JavaScript 核心

闭包 Closure

函数与其词法环境的组合——闭包如何让变量在函数调用结束后依然存活。

什么是闭包

闭包是「函数」与「其定义时所在的词法环境」的组合。当一个内部函数引用了外部函数的变量,即使外部函数已执行完毕,这些变量也不会被回收——它们被内部函数「闭」住了。

下面的计数器中,count 定义在 createCounter 内,每次点击调用返回的函数,count 都被保留并累加。这正是闭包:变量的生命周期被延长。

参数可调面板
function createCounter() {
  let count = 0;           // 私有变量
  return () => ++count;    // 闭包:引用并保持 count
}
const c1 = createCounter(); // 各自独立的 count
const c2 = createCounter();
c1(闭包 #10

每个计数器的 count 互不影响——这正是闭包:函数记住了它出生时的词法环境。

经典循环陷阱

var 在循环中创建定时器回调,所有回调共享同一个变量,循环结束后它们读到的是同一个最终值。改用 let 后,每次迭代会创建独立的块级绑定,闭包各自捕获不同的值。

在下面的 Playground 里把 var 改成 let,运行看输出差异。

可运行 Playground
加载交互编辑器…
学完了?做几道题巩固一下
针对「JavaScript 核心」范围练习