如何在JavaScript中实现multipliedResult(3)(4)(5)返回60?是否需递归?
实现支持链式调用的乘法函数
multipliedResult 要实现 multipliedResult(3)(4)(5) 返回60,本质上是要写一个柯里化(Currying)函数——也就是每次调用后返回一个新的函数,直到完成所有参数的收集后再计算最终结果。
一、针对固定三次调用的简单实现
如果只需要支持三次链式调用,其实不需要递归,直接嵌套返回函数就行:
function multipliedResult(a) { return function(b) { return function(c) { return a * b * c; } } } // 测试: console.log(multipliedResult(3)(4)(5)); // 输出60
这种写法很直观,每一层函数接收一个参数,最后一层计算乘积返回结果。
二、支持任意次数链式调用的通用实现(递归版)
如果希望函数能支持任意次数的调用(比如 multipliedResult(2)(3)(4) 返回24,multipliedResult(1)(2)(3)(4)(5) 返回120),那递归就是更优雅的方案:
function multipliedResult(num) { // 定义内部递归函数,保存当前累计的乘积 function multiplyNext(nextNum) { num *= nextNum; return multiplyNext; } // 重写toString方法,当函数被隐式转换为字符串时返回最终乘积 multiplyNext.toString = function() { return num; }; return multiplyNext; } // 测试: console.log(multipliedResult(3)(4)(5)); // 输出60 console.log(multipliedResult(2)(3)(4)); // 输出24
这里的原理是:
- 每次调用函数时,都会更新累计的乘积,然后返回自身(递归的核心)
- 当最后需要输出结果时,JavaScript会隐式调用函数的
toString方法,我们重写这个方法来返回最终的乘积
三、非递归的通用实现(利用闭包保存状态)
如果你不想用递归,也可以用闭包维护累计值,结合函数的隐式转换来实现:
function multipliedResult(initial) { let total = initial; const fn = function(next) { total *= next; return fn; }; fn.toString = () => total; return fn; } // 测试同样有效: console.log(multipliedResult(3)(4)(5)); // 60
总结
- 如果只是满足固定三次调用的需求,不需要递归,嵌套返回函数即可;
- 如果要支持任意次数的链式调用,递归是很自然的实现方式,当然也可以用闭包维护状态的非递归方案。
内容的提问来源于stack exchange,提问作者Nandish
相关产品推荐
相关产品推荐

