“面试官:说说闭包?
我:函数包函数…能访问外层变量…(自信)
面试官:(冷笑)然后呢?内存泄漏怎么解决?React Hooks 为什么依赖它?
——瞬间被秒成渣😭 血泪总结闭包7层攻击力,下次我要反杀!”
1. 第一层:基础定义(小白也能懂)
// 最简闭包示例 → 可视化讲解
function 厨房() {
const 秘制酱料 = "🔥绝密配方";
return function 厨师() {
console.log("我知道秘方:" + 秘制酱料); // 访问外层变量
};
}
const 偷师 = 厨房();
偷师(); // "我知道秘方:🔥绝密配方"
✅ 核心点:函数嵌套 + 内层函数引用外层变量(面试官点头关键词)
2. 第二层:应用场景(展示工程思维)
-
场景1:封装私有变量(拒绝全局污染)
// 计数器模块 function createCounter() { let count = 0; // 隐藏变量 return { add: () => count++, get: () => count }; } const counter = createCounter(); counter.add(); console.log(counter.get()); // 1 → 外部无法直接修改count -
场景2:React Hooks 核心机制(绑定最新状态)
// 模拟useEffect闭包陷阱 function MyComponent() { const [count, setCount] = useState(0); useEffect(() => { const timer = setInterval(() => { console.log(count); // 永远输出0 → 闭包捕获初始值 }, 1000); return () => clearInterval(timer); }, []); // 解决方案:依赖数组添加count 或 useRef }
3. 第三层:致命风险(亮出高阶认知)
// 内存泄漏现场
function 巨型工厂() {
const 巨型数组 = new Array(1000000).fill("🚢");
return () => console.log(巨型数组.length);
}
const 存货 = 巨型工厂(); // 函数执行后 → 巨型数组本应销毁
存货(); // 但闭包引用导致1MB内存永久泄漏!
✅ 破局方案:
① 及时解除引用:存货 = null
② 避免循环引用
③ 使用Chrome DevTools Memory面板检测
升华结尾(制造转发冲动)
“闭包是前端人的核武器:
- 初级:背概念
- 中级:会写应用
- 高级:能用它解决框架底层问题+防止内存炸弹
下次面试,请用这份答案把问题反向碾压👊”