函数是可复用的行为单元。作用域决定“能看见哪些变量”;闭包则是函数带着创建它的环境一起离开。

makeCounter 作用域 let count = 0 返回的函数仍可见 count
图:内部函数仍可访问外层作用域中的 count

闭包小例子

function makeCounter() {
  let count = 0;
  return function () {
    count += 1;
    return count;
  };
}
const next = makeCounter();
next(); // 1
next(); // 2

count 没有暴露给外部,却被返回的函数持续使用——这就是闭包的实用形态:封装状态。

注意点

  • 在循环里用 var 绑定事件,容易共享同一个变量;改用 let 或单独工厂函数。
  • 闭包持有大对象时,记得及时解除引用,避免内存常驻。