Skip to content

闭包

闭包的概念

什么是闭包?
闭包函数:函数内部声明的函数就是闭包函数,内部函数可以访问外部函数的变量

特点:

  • 可以避免污染全局变量
  • 影响 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

  • 省流: 被函数包裹的函数就是闭包函数,变量是局部的,会造成内存泄漏,但是可以持久化变量