JavaScript中参数数量未知的柯里化add函数实现方案
实现支持链式调用的灵活加法函数
add 嗨,这个问题挺有意思的,要实现一个既能单次传多个参数、又能链式调用的加法函数,核心思路是用闭包维护累加的总和,同时让返回的函数具备「可被求值」的能力。下面咱们一步步来拆解实现:
核心思路拆解
- 用闭包保存累计的总和:每次调用函数时,把传入的所有参数都加到这个总和里,闭包能让这个总和在多次调用间保持状态。
- 返回可继续调用的函数:每次调用后返回自身,这样就能实现链式调用。
- 让函数能被当作数值使用:利用JavaScript的
valueOf或toString方法,当函数需要被转换为原始值时(比如打印、参与运算),自动返回累计的总和。
具体代码实现
function add(...args) { // 初始化累计总和,把第一次传入的参数都加起来 let total = args.reduce((acc, num) => acc + num, 0); // 定义内部函数,用于后续的链式调用 const adder = (...nextArgs) => { // 把新传入的参数累加到总和里 total += nextArgs.reduce((acc, num) => acc + num, 0); // 返回自身,实现链式调用 return adder; }; // 重写valueOf方法,当需要获取数值时返回总和 adder.valueOf = () => total; // 重写toString,保证在字符串场景下也能正确输出 adder.toString = () => String(total); return adder; }
测试验证
咱们来测试题目里的两种场景:
console.log(add(1)(2)(3)); // 输出 6 console.log(add(1, 2)(3, 4)(5)); // 输出 15
甚至还支持更多灵活的调用方式:
console.log(add(1, 2, 3)(4)); // 10 console.log(add()(5)(6, 7)); // 18 console.log(add(2)(3) + 4); // 9 (参与运算也能正确工作)
原理说明
- 闭包的作用:
total变量被内部的adder函数引用,所以每次调用adder时,都能访问并更新这个变量,实现跨调用的累加。 - 链式调用的实现:每次调用
adder都会返回自身,所以可以一直链式调用下去,不断传入新的参数。 - 值的隐式转换:当我们尝试打印函数、或者让函数参与数值运算时,JavaScript会自动调用
valueOf(或toString)方法,这时候就返回了累计的总和,所以能得到正确的结果。
内容的提问来源于stack exchange,提问作者darKnight
相关产品推荐
相关产品推荐

