如何在JavaScript中创建支持任意次数调用的动态函数柯里化?
问题描述
原本需要实现一个基于柯里化返回函数的乘法函数,现要求升级为支持任意次数调用的版本,比如可以执行console.log(xx(2)(3)(4)(5)(6))这类场景,同时需要检查并忽略空参数(如undefined、null)。现有代码仅支持固定4次调用,无法满足动态次数需求:
function xx (x){ return (y) => { return (z) => { return ()=>{ return x*y*z; } } } } console.log(xx(2)(3)(4)); // 输出的是函数,而非计算结果
实现方案
利用闭包维护参数列表,结合函数的toString重写实现自动计算,同时过滤无效空参数:
function xx(...args) { // 收集有效参数,过滤undefined和null const validParams = [...args].filter(arg => arg !== undefined && arg !== null); // 定义柯里化函数,处理后续调用 const curriedFn = (...nextArgs) => { // 若本次调用无参数,直接返回乘积结果 if (nextArgs.length === 0) { return validParams.length === 0 ? 0 : validParams.reduce((total, num) => total * num, 1); } // 合并新参数,继续返回柯里化函数 return xx(...validParams, ...nextArgs); }; // 重写toString,让console.log直接输出计算结果 curriedFn.toString = () => { return validParams.length === 0 ? '0' : validParams.reduce((total, num) => total * num, 1).toString(); }; return curriedFn; }
测试示例
// 直接打印多次调用的结果 console.log(xx(2)(3)(4)); // 输出 "24" console.log(xx(2)(3)(4)(5)(6)); // 输出 "720" // 调用不带参数时返回数值结果 console.log(xx(2)(3)(4)()); // 输出 24 // 自动忽略空参数 console.log(xx(2)(null)(undefined)(3)()); // 输出 6 // 无参数调用的情况 console.log(xx()); // 输出 "0"
内容的提问来源于stack exchange,提问作者Rayan Hardy
相关产品推荐
相关产品推荐

