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

使用reduce函数获取被调用函数返回值的技术问题

解决你的reduce函数返回值问题

我明白你想通过原生reduce实现一个函数,直接返回传入函数的执行结果,但目前你的代码返回的是函数本身,不是预期的42。咱们一步步理清楚问题和解决方案:

原代码的问题分析

先看你的代码:

const test = (...ps) => ps.reduce((prev, next) => parameter => prev(parameter));

当你调用test(() => 42)时,ps数组只有一个元素() => 42。reduce方法在数组长度为1时,会直接返回这个唯一的元素,不会执行回调函数——所以你得到的是那个未执行的函数,而不是它的返回值42。

另外还有个小问题:你的reduce回调里完全没用到next参数,就算传入多个函数,也不会有任何组合或链式执行的效果,只是返回第一个函数的包装函数而已。

解决方案

根据你的需求(获取传入函数的返回值),这里有几种基于reduce的实现方式:

方案1:直接执行reduce返回的函数

既然你的代码最终返回的是一个函数,那我们只需要在reduce结束后手动执行它即可:

const test = (...ps) => ps.reduce((prev, next) => param => prev(param))();

调用test(() => 42)时,reduce直接返回() => 42,后面的()会执行这个函数,最终得到42。

方案2:正确实现函数组合并自动执行

如果你希望支持多个函数的链式执行(比如test(f1, f2)等价于f1(f2())),可以用reduceRight从右到左执行函数,自动返回最终结果:

const test = (...ps) => ps.reduceRight((acc, fn) => fn(acc), undefined);
  • 调用test(() => 42):直接执行() => 42,传入undefined,返回42。
  • 调用test(x => x * 2, () => 21):先执行() => 21得到21,再把21传给x => x*2,返回42。

方案3:仅处理单个函数的情况(贴合你的示例)

如果你的场景只需要处理传入单个函数的情况,用reduce可以这样写:

const test = (...ps) => ps.reduce((result, fn) => fn(), ps[0]());

不过这个场景下reduce有点大材小用,直接ps[0]()更简单,但既然你想使用reduce,这个写法也能满足需求。

验证结果

不管用哪种方案,调用test(() => 42)都会得到你期望的42,而不是一个函数啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:28:49