闭包
闭包的概念
什么是闭包?
闭包函数:函数内部声明的函数就是闭包函数,内部函数可以访问外部函数的变量
特点:
- 可以避免污染全局变量
- 影响 JS 的垃圾回收机制,导致内存泄漏
应用场景:变量持久化、缓存函数减少重复的逻辑处理,提高性能、函数柯里化、
TIP
闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,互不干扰。闭包会发生内存泄漏,每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删除,保留一根指针给内部活动对象。
示例
js
// 定义一个记忆化函数,用于缓存函数的计算结果
function memoize(func) {
// 创建一个对象,用于存储函数的计算结果
const cache = {};
return function(...arg) {
// 将参数转换为字符串作为缓存的键
const key = JSON.stringify(arg)
if (cache[key]) {
// 如果存在,直接返回缓存的结果
return cache[key]
} else {
// 不存在则调用计算函数,并将结果存储在缓存中,并返回结果
const result = func(...arg)
cache[key] = result;
return result;
}
}
}
// 一个计算乘积的计算函数
function expensiveCalculation(...args) {
console.log('正在计算', ...args);
// 计算所有参数的乘积并返回
return args.reduce((product, arg) => product * arg)
}
const memoizedCalculation = memoize(expensiveCalculation);
console.log(memoizedCalculation(5,2,3)); // 输出 正在计算 5,2,3 输出 30
console.log(memoizedCalculation(5,2,3)); // 输出 30
console.log(memoizedCalculation(5,2,3)); // 输出 30
console.log(memoizedCalculation(5,2,3)); // 输出 30
console.log(memoizedCalculation(5,2,3)); // 输出 30控制台输出如下:
在需要多次重复计算的情况下,只计算一次,缓存处理好的结果,再下次需要的时候直接返回缓存的值,而不重新计算,优化性能
TIP
- 省流: 被函数包裹的函数就是闭包函数,变量是局部的,会造成内存泄漏,但是可以持久化变量
