本文共 1522 字,大约阅读时间需要 5 分钟。
分析:
1.这个函数接受一个处理函数作为参数; 2.这个函数返回一个匿名函数; 3.这个函数内部需要创建一个对象(cache)将传入的处理函数的执行结果缓存; 3.1用return出去的匿名函数的参数(arguments)作为这个对象(cache)的键,这个对象(cache)的值是传入的处理函数的执行结果。 3.2通过判断对象(cache)里是否已有return出去的匿名函数的参数(arguments)这个键来做是否要执行处理函数的依据。 3.3若对象(cache)已有return出去的匿名函数的参数(arguments)这个键的话就直接返回对应的缓存值;没有就执行处理函数,并将值做缓存。// const _ = require("lodash");function getArea(r) { console.log("半径", r); return Math.PI * r * r;}// Lodash里的记忆函数// const getMemoizeArea = _.memoize(getArea)// getMemoizeArea(2)// getMemoizeArea(2)// getMemoizeArea(2)// console.log(getMemoizeArea(null));// console.log(getMemoizeArea(null));// console.log(getMemoizeArea(null));// console.log(getMemoizeArea(undefined));// console.log(getMemoizeArea(undefined));// console.log(getMemoizeArea(undefined));// 记忆函数function memoize(fn) { const cache = { }; return function () { const key = JSON.stringify(arguments); // cache[key] = cache[key] || fn.apply(null, arguments); // 存在缓存的值为0时,缓存失效 // cache[key] = cache[key] ?? fn.apply(null, arguments) // 空值合并运算符,在ES2020才新增的。也存在缓存结果为null或者undefined时,缓存失效问题。 if (!Object.keys(cache).includes(key)) { // console.log('未缓存过') cache[key] = fn.apply(null, arguments); } return cache[key]; };}const myMemoize = memoize(getArea);console.log(myMemoize(0));console.log(myMemoize(0));console.log(myMemoize(0));console.log(myMemoize(null));console.log(myMemoize(null));console.log(myMemoize(null));console.log(myMemoize(undefined));console.log(myMemoize(undefined));console.log(myMemoize(undefined));
转载地址:http://qtvrn.baihongyu.com/