// 将多参数的函数转换成单参数的形式
//利用闭包原理在执行可以形成一个不销毁的作用域,
//然后把需要预先处理的内容都储存在这个不销毁的作用域中,
//并且返回一个最少参数函数。
// 第一种:参数够了才执行
// 第二种:不传入固定参数,随时执行
// 参考 https://www.jianshu.com/p/c87242cd2f6c?spm=wolai.workspace.0.0.1280767bqHwrDr
//把多参函数转换成一元函数的curry函数
let curry = (fn) => {
if (typeof fn !== 'function') {
throw new Error('No Function Provided!');
}
return function curriedFn(...args) {
if (args.length < fn.length) {
return function (...innerArgs) {
return curriedFn.apply(null, [...args, ...innerArgs]);
}
} else {
return fn.apply(null, args);
}
}
}
// add(1)(2)(3)(4) => 10
// add(1,2,3,4) => 10
// add(1,2)(3,4) => 10
function add() {
var args = [].slice.call(arguments); // 第一次执行时,定义一个数组专门用来存储所有的参数
var _add = function () { // 在内部声明一个函数,利用闭包的特性保存args并收集所有的参数值
args.push(...arguments);
return _add;
}
_add.toString = function () { // 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
return args.reduce((a, b) => {
return a + b;
})
}
return _add
}
console.log(add(1,2)(3,4).toString())
实现柯里化
最新推荐文章于 2024-07-18 10:24:18 发布