编写JavaScript记忆化函数遇报错:TypeError: getNthFibonacciNo不是函数
排查TypeError: getNthFibonacciNo is not a function及记忆化函数的常见问题
一、核心错误原因分析
你遇到的TypeError: getNthFibonacciNo is not a function,结合你给出的记忆化函数片段,大概率是这两个问题导致的:
1. 记忆化函数的实现逻辑错误
看你写的memoize开头代码:
function memoize(fn) { var cache = {}; if (cache[arguments[0]]!==und...
这里有个致命问题:你在memoize函数的外层直接使用arguments[0],但这里的arguments是memoize自身的参数(也就是你传入的斐波那契原函数),不是后续调用记忆化函数时的参数。更关键的是,你没有返回一个新的函数——如果getNthFibonacciNo是memoize(原斐波那契函数)的结果,那它根本不是函数,而是memoize执行后的返回值(没写return的话就是undefined),自然会报“不是函数”的错误。
2. getNthFibonacciNo的赋值问题
- 可能你没把
memoize返回的函数正确赋值给它,比如错误写法:
正确应该是:// 错误:只是执行了memoize,没把返回值赋值给变量 memoize(function getNthFibonacciNo(n) { ... });const getNthFibonacciNo = memoize(function(n) { ... }); - 或者用
var导致变量提升问题,提前调用了还没赋值的变量:getNthFibonacciNo(5); // 此时var声明的变量是undefined,还没拿到记忆化函数 var getNthFibonacciNo = memoize(...);
二、修复后的正确记忆化函数实现
给你一个标准的、能正常工作的记忆化函数实现,解决上述问题:
function memoize(fn) { const cache = {}; // 返回一个新函数,这个才是后续被调用的记忆化版本 return function(...args) { // 将参数序列化为字符串当缓存key(简单场景够用,复杂参数可优化序列化方式) const key = JSON.stringify(args); if (cache[key]) { console.log('从缓存读取结果'); return cache[key]; } // 调用原函数并缓存结果 const result = fn.apply(this, args); cache[key] = result; return result; }; } // 定义斐波那契函数并绑定记忆化 const getNthFibonacciNo = memoize(function(n) { if (n <= 1) return n; // 注意这里要调用记忆化后的函数,才能触发缓存 return getNthFibonacciNo(n - 1) + getNthFibonacciNo(n - 2); }); // 测试调用 console.log(getNthFibonacciNo(10)); // 正常输出55
三、其他可能的问题排查
- 缓存key的序列化问题:如果你的函数有多个参数,或者参数是对象/数组,直接用单个参数当key会失效,上面用
JSON.stringify(args)更通用,但如果参数包含函数等不可序列化的值,需要调整key的生成逻辑。 - 递归调用的作用域问题:如果原斐波那契函数内部调用的是自身(未记忆化的版本),而不是记忆化后的
getNthFibonacciNo,那缓存会完全失效,这点一定要注意。 - 变量作用域问题:如果
getNthFibonacciNo定义在局部作用域(比如某个函数内部),在外部调用时会找不到变量,也会触发类似错误,要确保它在调用的作用域内可访问。
内容的提问来源于stack exchange,提问作者user2156888
相关产品推荐
相关产品推荐

