柯里化函数
2020-05-27 本文已影响0人
monkeyfly36
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
A:理解版
// 柯里化函数
const curring = (fn) => {
let _args = []
return function cb(){
// arguments.length === 0 当不传参数时进行计算 --> 最后一步执行,只执行一次
if (arguments.length === 0) return fn.apply(this, _args)
// arguments.length !== 0 精髓:用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数
_args = [..._args, ...arguments]
return cb
}
}
// 求和计算
const multi = (...args) => {
return args.reduce((a, b) => {
return a + b
})
}
// 函数声明变量
const calc = curring(multi)
console.log(calc(1,2)(3)(4,5,6)())
B:通用版
var add = function() {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = [...arguments]
// 精髓1: 利用闭包的特性保存_args并收集所有的参数值
const _adder = function() {
_args = [..._args, ...arguments]
return _adder
}
// 精髓2: 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function () {
return _args.reduce((a, b) => {
return a + b
})
}
return _adder
}
C:极简版
var add = (...args) => {
// 精髓: 将args作为闭包变量, 收集所有参数
let _adder = (..._args) => {
args = [...args, ..._args]
return _adder
}
_adder.toString = () => args.reduce((a, b) => a + b)
return _adder
}