返回知识详解
JavaScript 核心
闭包 Closure
函数与其词法环境的组合——闭包如何让变量在函数调用结束后依然存活。
什么是闭包
闭包是「函数」与「其定义时所在的词法环境」的组合。当一个内部函数引用了外部函数的变量,即使外部函数已执行完毕,这些变量也不会被回收——它们被内部函数「闭」住了。
下面的计数器中,count 定义在 createCounter 内,每次点击调用返回的函数,count 都被保留并累加。这正是闭包:变量的生命周期被延长。
⚡ 参数可调面板
function createCounter() {
let count = 0; // 私有变量
return () => ++count; // 闭包:引用并保持 count
}
const c1 = createCounter(); // 各自独立的 count
const c2 = createCounter();c1(闭包 #1)0
每个计数器的 count 互不影响——这正是闭包:函数记住了它出生时的词法环境。
经典循环陷阱
用 var 在循环中创建定时器回调,所有回调共享同一个变量,循环结束后它们读到的是同一个最终值。改用 let 后,每次迭代会创建独立的块级绑定,闭包各自捕获不同的值。
在下面的 Playground 里把 var 改成 let,运行看输出差异。
⚡ 可运行 Playground
加载交互编辑器…