JavaScript中实现sum(2)(3)(4)...(n)链式调用求累加和的方法
实现支持无限链式调用的sum函数
这个问题我之前也碰到过!你当前的sum函数只能处理两次调用,因为每次返回的函数做完一次加法就直接返回结果了,没办法继续累积后续传入的数值。要实现sum(2)(3)(4)...(n)这种无限链式调用的求和,咱们可以利用JavaScript中函数的隐式类型转换特性来解决,下面给你两种实用方案:
方案一:利用隐式转换自动返回总和
这种方案不需要额外调用无参方法,当你需要获取结果时(比如打印、参与运算),JS会自动帮你转换为累加的总和:
function sum(a) { let total = a; const add = function(b) { total += b; return add; }; // 重写toString,当函数被转为字符串时返回总和 add.toString = () => total; // 重写valueOf,确保数值场景下也能正确返回总和 add.valueOf = () => total; return add; }
使用示例
// 直接打印链式调用的结果 console.log(sum(2)(3)(4)); // 输出 9 console.log(sum(1)(2)(3)(4)(5)); // 输出 15 // 参与数值运算也没问题 console.log(sum(5)(3) + 2); // 输出 10 console.log(sum(10)(-5) * 2); // 输出 10
原理说明
- 外层
sum函数接收第一个参数,初始化累加器total。 - 内部的
add函数每次接收新参数,把它加到total上,然后返回自身,这样就能一直链式调用下去。 - 重写
toString和valueOf是核心:当JS需要把这个函数转为原始值(比如字符串、数字)时,会自动调用这两个方法,返回我们累积的总和。
方案二:支持无参调用直接获取结果
如果你更习惯通过最后加个()来得到结果,可以在内部函数里判断是否传入参数:
function sum(a) { let total = a; const add = function(b) { // 如果没有传参数,直接返回当前总和 if (typeof b === 'undefined') { return total; } total += b; return add; }; // 同样保留隐式转换的支持 add.toString = () => total; add.valueOf = () => total; return add; }
使用示例
// 无参调用获取结果 console.log(sum(2)(3)(4)()); // 输出 9 // 当然也支持之前的隐式转换方式 console.log(sum(5)(3)); // 输出 8
这样两种方式都能满足你的需求,看你更喜欢哪种风格啦~
内容的提问来源于stack exchange,提问作者vishal kumar
相关产品推荐
相关产品推荐

