什么是函数柯里化?
在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。
例子一
看一个普通的 add 函数
function add(a, b) {
return a + b
}
add(2, 3); // 5
假如我想要这样一个函数,怎么实现
curryAdd(2)(3); // 5
你可能会这样设计
function curryAdd(a) {
return (b) => {
return a + b
}
}
但是我想要连续传呢?比如我想这样用。
curryAdd(1)(2)(3)(4)(..)
这就要用到函数柯里化了,使用之前,一定要理解这句话。
将一个接受多个参数的函数,转换为一系列使用一个参数的函数,这就是函数柯里化。
例子二
还是一个 add 函数
function add(a, b ,c ,d ,e){
console.log(a + b + c + d + e)
}
let _fn = curry(add);
如何才能使得 _fn,可以这样调用呢?
_fn(1, 2, 3, 4, 5); // 15
_fn(1)(2)(3)(4)(5); // 15
_fn(1)(2, 3)(4, 5); // 15
我们可以借助闭包实现,用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数。
function curry(fn, len = fn.length){
return _curry.call(this, fn, len)
}
function _curry(fn, len, ...args){
return function(...params){
console.log(`params: ${params}`);
let _args = [...args, ...params];
console.log(`_args:${_args}`)
if(_args.length >= len){
return fn.apply(this, _args)
}else{
return _curry.call(this, fn, len, ..._args)
}
}
}
网友评论