柯里化-偏函数-反柯里化

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}

参考:https://segmentfault.com/a/1190000022416728


上一篇
http缓存 http缓存
一、3种强缓存描述: 不需要发送请求到服务端,直接读取浏览器本地缓存 1. Expires(最低优先级)Expires 的值是一个 HTTP 日期,WEB服务器使用Expires头来告诉Web客户端,会根据系统时间和 Expires 的值进
2020-07-22
下一篇
开机自启全屏设置chrome和firefox 开机自启全屏设置chrome和firefox
一. 设置开机自启浏览器注: 此设置基于ubuntu系统1.新建autostar# 查看有没有autostart文件,没有新建 $ mkdir ~/.config/autostart 2.拷贝.desktop 到 autostart# 查