使用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
相关产品推荐
相关产品推荐

