闭包是JavaScript中实现轻量级缓存查询最直接可控的方式,因其能私有保存缓存对象、避免全局污染、免序列化开销、内存读写快、键值自动生成且生命周期与函数绑定。
闭包是 JavaScript 中实现轻量级缓存查询最直接、最可控的方式,特别适合优化那些输入确定、计算耗时、调用频繁的函数——比如递归数学运算、树形结构遍历、API 响应解析等。
闭包让内部函数能持续访问外层作用域中的变量,而这个变量(通常是对象)正好可作为私有缓存容器。它不依赖全局变量,避免命名污染;也不依赖外部存储(如 localStorage 或 Redis),省去序列化和网络开销;更重要的是,缓存生命周期与函数实例绑定,不同调用场景互不干扰。
不用第三方库,几行代码就能写出可复用的缓存包装器:
function memoize(fn) { const cache = new Map(); // 推荐用 Map,支持任意类型键(如对象、数组) return function(...args) { const key = JSON.stringify(args); // 简单场景可用;复杂对象建议用结构化比较或自定义 key 生成 if (cache.has(key)) { return cache.get(key); } const result = fn(...args); cache.set(key, result); return result; };}
用法示例:
const fibonacci = memoize((n) => { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2);});<p>console.log(fibonacci(40)); // 首次执行较慢,但只算一次console.log(fibonacci(40)); // 瞬间返回,从缓存取
闭包缓存不是“开箱即用”的银弹,几个实际问题得提前想清楚:
闭包缓存是单实例、内存级、无一致性保障的优化手段: