1. 柯里化
描述:柯里化算是特殊的偏函数,把一个多参数函数转换成多个单参数函数,也就是说把一个具有n个参数的函数转换成n个一元函数
特点:
1、闭包,调用柯里化函数(currie)返回另外一个函数(_myFn),通过闭包缓存真正执行运算的函数(fn)和参数(args)
2、 通过返回的函数传递参数,并进行判断,如果参数已经传递够了,就执行函数(fn)并返回结果,如果参数还没传递完,则继续返回函数(_myFn)接收参数
例子:
// 正常写法
const add = (a + b) => a+b
const resAdd = add(2, 3)
// 柯里化
const add = a => b => a+b;
const resCurrie = add(2)(3)
2. 偏函数
描述: 偏函数又叫局部应用,固定函数的一个或多个参数
特点:偏函数的代码比较简单,就是利用闭包缓存实际的执行方法(fn)和与之的参数(preset),然后返回一个接收剩余参数的方法,方法的实现就是执行fn并返回结果
举例:
// 一般写法
// 封装一个ajax方法
function ajax (url, data, callback) {
...
}
// 调用ajax方法,
ajax('http://xxx.com', { a: 'aa' }, function () { // 回调 A })
ajax('http://xxx.com', { b: 'bb' }, function () { // 回调 B })
ajax('http://xxx.com', { y: 'yy' }, function () { // 回调 Y })
// 上面url参数重复填写
// 偏函数
function partial (url) {
return function (data, cb) {
ajax(url, data, cb)
}
}
// 调用偏函数
const partialAjax = partial('http://lyn.com')
// 发送ajax请求
partialAjax({ a: 'aa' }, function () { // 回调 A })
partialAjax({ b: 'bb' }, function () { // 回调 B })
partialAjax({ y: 'yy' }, function () { // 回调 Y })
3.反柯里化
描述: 反柯里化作用和偏函数相反,它的本质是增强一个函数的使用范围,让一个对象可以使用不属于对象自己的方法,就像apply、call、bind(也有偏函数的作用)的作用,而事实上反柯里化就是通过apply、call方法实现的。
举例:
Function.prototype.uncurrie = function (obj) {
// 参数obj是需要操作的对象
// 这里的this是指obj对象需要借用的方法,比如示例中的Array.prototype.push
const fn = this
return function (...args) {
// 难点,以下代码相当于:fn.call(obj, ...args), 没理解请看下面的 “代码解析” 部分
return Function.prototype.call.apply(fn, [obj, ...args])
}
}
// 示例,导出Array.prototype.push方法给对象使用
const obj = { a: 'aa' }
const push = Array.prototype.push.uncurrie(obj)
push('b')
push('c')
console.log(obj) // {0: "b", 1: "c", a: "aa", length: 2}