柯里化(Currying)是把接受多个参数
的函数变换成接受一个单一参数
(最初函数的第一个参数)的函数
,并且返回接受余下的参数且返回结果
的新函数的技术。
说的啥玩意啊?是不是一脸懵逼~
接下来咱们用一个经典的面试题讲解下:实现 add(1)(2)(3) 求和
第一步:接收三个参数
function add (a, b, c) {
return a + b + c
}
// add(1, 2, 3)
第二步:接收两个参数
function add (a, b) {
return function (c) {
return a + b + c
}
}
// add(1,2)(3)
到这是不是有点眉头了?
第三步:每个函数都接收一个参数
function add (a) {
return function (b) {
return function (c) {
return a + b + c
}
}
}
// add(a)(b)(c)
es6 更简单
const add1 = (a, b) => a + b
const add2 = a => b => a + b
const add3 = a => b => c => a + b + c
看到这咱们就大致明白前文的解释了,将多个参数
函数变为接受一个单一参数
的函数。
但是假如面试官
让你用一个函数
同时支持 add(1,2,3)
, add(1,2)(3)
, add(1)(2)(3)
怎么办?
先补充个概念,下面要用到 --- 函数的长度
是啥?
function test (a) {}
console.log(test.length) // 1
function test (a, b) {}
console.log(test.length) // 2
由此得知 函数的长度 就是 形参
的个数
判断当前传入函数的参数个数 (args.length) 是否大于等于原函数所需参数个数 (fn.length) ,如果是,则执行当前函数;如果是小于,则返回一个函数。
const curry = (fn, ...args) => {
if (args.length >= fn.length) {
return fn(...args) // 执行当前函数
} else {
return (..._args) => { // 返回一个函数
return curry(fn, ...args, ..._args)
}
}
}
总结不到位的请多多交流指出~