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

JavaScript编码挑战:修改makeSFns函数遇funcs[i]非函数错误求助

解决makeSFns函数的"funcs[i] is not a function"错误

嘿,我完全懂你的困惑!咱们一步步把这个问题理清楚:

核心问题:你返回的是数值,而题目需要的是函数数组

你之前的思路是直接把square(i)的计算结果(数值)塞进数组,但这个编码挑战里的makeSFns函数要求返回的是函数的数组——也就是说,数组里的每个元素都得是一个可以被调用的函数,而不是直接的数值。

举个例子,假设测试逻辑大概是这样的:

function square(x) { return x * x; }
const myFuncs = makeSFns(3);
// 这里会调用数组里的每个函数
console.log(myFuncs[0]()); // 期望输出 0
console.log(myFuncs[1]()); // 期望输出 1
console.log(myFuncs[2]()); // 期望输出 4

如果你的makeSFns返回的是[0, 1, 4](直接的数值数组),那执行myFuncs[0]()就相当于在调用0()——数字当然不是函数,所以会抛出funcs[i] is not a function的错误。

正确的写法:返回函数而非数值

你需要让数组里的每个元素都是一个匿名函数,这个函数在被调用时才会去计算并返回对应的平方值。这里还要注意循环中的闭包陷阱,推荐用let(ES6+的块级作用域)来避免:

function makeSFns(n) {
  const funcs = [];
  for (let i = 0; i < n; i++) {
    // 推入一个函数,调用它时才执行square(i)
    funcs.push(() => square(i));
  }
  return funcs;
}

如果环境不支持let,可以用立即执行函数(IIFE)来创建闭包,保存每一轮循环的i值:

function makeSFns(n) {
  const funcs = [];
  for (var i = 0; i < n; i++) {
    funcs.push((function(num) {
      return () => square(num);
    })(i));
  }
  return funcs;
}

为什么这样可行?

现在makeSFns返回的数组里,每个元素都是一个独立的函数。当你调用funcs[i]()时,这个函数才会执行square(i)(或者square(num)),返回对应的平方数值,完全符合测试逻辑的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:04:53