You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

三、其他可能的问题排查

  1. 缓存key的序列化问题:如果你的函数有多个参数,或者参数是对象/数组,直接用单个参数当key会失效,上面用JSON.stringify(args)更通用,但如果参数包含函数等不可序列化的值,需要调整key的生成逻辑。
  2. 递归调用的作用域问题:如果原斐波那契函数内部调用的是自身(未记忆化的版本),而不是记忆化后的getNthFibonacciNo,那缓存会完全失效,这点一定要注意。
  3. 变量作用域问题:如果getNthFibonacciNo定义在局部作用域(比如某个函数内部),在外部调用时会找不到变量,也会触发类似错误,要确保它在调用的作用域内可访问。

内容的提问来源于stack exchange,提问作者user2156888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:41:42