curry简介
它是一个函数,可以接受一个函数作为参数,并返回一个接受下一个参数的函数,通过闭包的形式存储传入进来的参数,当参数的长度等于最初传进来的函数的参数长度时,开始执行最初的函数,如果参数的长度不相等,则直接返回方法。
下面来看看它具体的效果。
function add (x, y, c) {
return x + y + c
}
const curry_add = curry(add)
curry_add(1)
curry_add(2)(3)
根据上面的效果和简介,我们自己来实现一个curry。
代码实现
第一步
// 是一个函数,接受一个函数作为参数,返回一个函数
function curry (fn) {
return function () { }
}
第二步
// 可以分步处理参数,即返回新函数的时候传了一部分参数,在调用这个新函数时还可以另外再传入参数
function curry (fn) {
const context = this // 记录环境执行上下文
return function (...args) {
// 将传进来的参数与当前的参数使用ES6语法进行合并
return fn.call(context, ...args, ...arguments)
}
}
第三步
// 当参数的长度等于最初传进来的函数的参数长度时,开始执行最初的函数
// 如果参数的长度不相等,则直接返回方法
function curry (fn) {
const context = this
// 如果参数不相等,直接返回新函数,因此在这里我们需要将返回的函数来定义一个名字func
return function func(...args) {
// 参数长度和初始函数的参数长度相等,通过函数的length属性可以获取函数参数长度
if (fn.length <= args.length) {
return fn.call(context, ...args)
}
return func.call(context, ...args, ...arguments)
}
}
// 测试一下
function add (a, b, c) {
return a + b + c
}
const fn1 = curry(add)(1)
const fn2 = fn1(2)
console.log(fn2(3)) // 6