闭包是内部函数记住并持续访问外部函数变量的机制,需满足三条件:内函数定义于外函数内、引用外函数变量、外函数返回内函数;核心用途包括封装私有变量、保持状态、避免全局污染及实现模块化。

JavaScript 闭包,简单说就是一个函数“记住了”它诞生时所处的环境,并能持续访问那个环境里的变量,哪怕这个环境(比如外层函数)早就执行完了、本该被清理掉。
闭包是怎么形成的
必须同时满足三个条件:
- 内部函数定义在外部函数里面
- 内部函数引用了外部函数的变量(包括参数、局部变量)
- 外部函数返回了这个内部函数(或以其他方式让内部函数在外部被调用)
一旦满足,JavaScript 引擎就不会回收外部函数的作用域——那些变量就被“关”在闭包里,持续可用。
闭包的核心用途:封装与延续
它不是炫技工具,而是解决实际问题的机制:
立即学习“Java免费学习笔记(深入)”;
YXPHP6系统可以看做是一个模版平台,而且它又能独立工作. 而且YXPHP6系统也不需要数据库支持. 你可以开发自己的模板,也可以同步官方的模板后进行自己的二次开发,前提是您对YXPHP6要有一定的了解.YXPHP6不仅可以用作企业建站,甚至是blog,只要是您能想到的,YXPHP6几乎都可以胜任. 因为YXPHP6系统本身与模板之间可以说是独立运行的.也就是说,不管你做什么样的网站或者是应用,
- 创建私有变量:外部无法直接访问外层函数里的变量,只能通过返回的内部函数间接读写,实现数据隐藏。比如计数器、配置项、缓存状态。
- 保持状态不丢失:在事件监听、定时器、回调中,闭包让函数能记住上次操作的上下文。例如点击按钮多次,每次都能拿到上一次的计数值。
- 避免全局污染:用立即执行函数 + 闭包(IIFE),把临时变量和逻辑封起来,不挂到 window 上,防止命名冲突。
- 实现模块化基础:早期没有 ES6 module 时,靠闭包模拟“导出接口”,只暴露需要的方法,内部逻辑完全隔离。
一个典型例子
下面这段代码就生成了一个闭包:
function createCounter() {let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
这里的 匿名函数记住了 count,即使 createCounter 已经运行结束,count 仍保留在内存中,供后续调用使用。
闭包本质是作用域链的自然结果,理解它关键不在背定义,而在看清“谁定义了谁”“谁引用了谁”“谁还在用它”。用得恰当,代码更健壮;滥用则可能引发内存泄漏。










