如何编写可连续单参数调用的JavaScript链式函数?附示例
如何实现可连续单参数调用的JavaScript函数
这个问题本质是函数柯里化的典型应用——我们需要让函数每次接收一个参数后,返回一个能继续接收下一个参数的函数,同时最终能返回累积的计算结果。下面给你两种实用的实现方案:
方案一:基于闭包累积值(易懂版)
这种方案用闭包保存累积的总和,通过重写函数的toString和valueOf方法让函数能被当作数值使用:
function sum(a) { // 用闭包保存累积的总和 let total = a; // 定义内部函数,用来接收后续参数 function add(b) { total += b; // 返回自身,实现链式调用 return add; } // 重写toString:当函数被转为字符串时返回总和 add.toString = function() { return total; }; // 重写valueOf:当函数参与数值运算时返回总和 add.valueOf = function() { return total; }; return add; }
测试效果
console.log(sum(1)(2)); // 输出 3 console.log(sum(1)(2)(3)); // 输出 6 console.log(sum(5)(3)(2) + 10); // 输出 20
方案二:ES6递归写法(简洁版)
利用ES6箭头函数和递归,代码更紧凑:
const sum = a => { // 递归返回新的sum函数,参数是累积后的总和 const add = b => sum(a + b); // 重写valueOf,直接返回当前累积的数值 add.valueOf = () => a; return add; };
测试效果
console.log(sum(2)(3)(5)); // 输出 10 console.log(+sum(1)(1)(1)(1)); // 输出 4(+号触发valueOf)
核心原理说明
- 闭包/递归用来保存每次传入的参数累积值,让后续调用能访问到之前的计算结果。
- 重写
toString和valueOf是关键:因为每次调用后返回的是函数,当我们需要获取它的数值结果时(比如打印、运算),JavaScript会自动调用这两个方法,把函数转为对应的数值。
内容的提问来源于stack exchange,提问作者0933322888
相关产品推荐
相关产品推荐

