柯里化

比如想要个函数计算一个月一共花了多少钱:

let sumMoney=0;
function cost(money){sumMoney+=money;
}
cost(100);
cost(50);
cost(200);
// 剩下的调用函数此处省略
console.log(sumMoney);

但实际上,我们并不希望这个cost函数执行31次,而是只在月底的时候执行1次。

改进:

(假设 参数为空就是到月底了)

let cost = (function () {let arg = [];return function () {if (arguments.length === 0) {let money = 0;for (let i = 0; i < arg.length; i++) {money += arg[i];}return money;} else {[].push.apply(arg, arguments);}}
})();
cost(100);
cost(50);
cost(200);
console.log(cost());

柯里化:

function cost() {let money = 0;for (let i = 0; i < arguments.length; i++) {money += arguments[i];}return money;
}
let currying = function (fn) {let arg = [];return function () {if (arguments.length === 0) {return fn.apply(this, arg);} else {[].push.apply(arg, arguments);}}
};
cost = currying(cost);
console.log(cost(100));
console.log(cost(50));
console.log(cost(200));
console.log(cost());

柯里化:

(不再依赖参数为空再累加)

function cost() {let money = 0;for (let i = 0; i < arguments.length; i++) {money += arguments[i];}return money;
}
let currying = function (fn) {let arg = [];return function () {[].push.apply(arg, arguments);return fn.apply(this, arg);}
};
cost = currying(cost);
console.log(cost(100));
console.log(cost(50));
console.log(cost(200));
console.log(cost());

反柯里化

比如Array.prototype.push()这个方法,但是它的作用对象是数组,

通过.call()改变它的作用对象,让它为一个对象或类数组对象。

通过call或apply的方式,更改当前的调用者,有没有一种方式让当前的函数不局限于当前的调用者本身,让函数更具有通用性。

Function.prototype.uncurrying = function() {let fn = this;return function () {let _this = Array.prototype.shift.call(arguments);// this是arguments的第一个参数return fn.apply(_this,arguments);}
}
let push = Array.prototype.push.uncurrying(); // 它是函数的方法,函数是个实例对象,就需要在Function.prototype上绑定方法
let obj = {};
console.log(push(obj, 'first', 'second'));
console.log(obj);

函数柯里化与反柯里化相关推荐

  1. 函数的 柯里化和反柯里化

    函数1 函数的柯里化 柯里化(currying)是把接收多个参数的函数变换成为接收一个部分参数的函数,并返回接收余下参数的新函数的技术.通常这个参数是一个. 可能我们对这个解释不太明白. 现在我们来思 ...

  2. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  3. 深度学习(一)神经网络中的池化与反池化原理

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9579108.html 参考博客:https://blog.csdn.net/chengqium ...

  4. 深入详解python高级特性——函数柯里化(Currying)与反柯里化

    前言:本章的内容本来很简单,但是涉及到的理论部分相对较多,想要彻底弄懂前因后果需要具备以下几个知识点, (1)python的高阶函数 (2)python的装饰器本质 (3)Python的functoo ...

  5. [CNN] 卷积、反卷积、池化、反池化

    之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积.反卷积.池化.反池化的内容,也希望自己对一些比较模糊的地方可以理解的更加清晰. 一.卷积 1.卷积的简单定义 卷积神经网络中的卷积操作可以看做是 ...

  6. 柯里化函数(Currying),什么是柯里化,为什么要进行柯里化,高级柯里化函数的实现

    柯里化(Currying) 柯里化(Currying)是一种关于函数的高阶技术.它不仅被用于 JavaScript,还被用于其他编程语言. 柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, ...

  7. 遍历HashMap源码——红黑树原理、HashMap红黑树实现与反树型化(三)

    本章将是HashMap源码的最后一章,将介绍红黑树及其实现,HashMap的remove方法与反树型化.长文预警~~ 遍历HashMap源码--红黑树原理.HashMap红黑树实现与反树型化 什么是红 ...

  8. PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)

    PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...

  9. gstat | 空间插值(三)——克里金插值之泛克里金和简单克里金

    本篇接着上篇继续介绍克里金插值.首先加载相关工具包和上篇使用的示例数据: library(gstat) library(sf) library(tidyverse) library(readxl) l ...

最新文章

  1. 机器学习(MACHINE LEARNING)从零搭建一个汽车状态分类器(Tensorflow)
  2. Windows上通过bat实现不同数据库之间同步部分表的部分字段数据
  3. Javascript基础系列之(五)条件语句(比较操作符)
  4. Visual Studio的语法着色终于调得赏心悦目
  5. Session和Cookie的学习笔记2
  6. 一句话总结重构、重载、重写
  7. haproxy1.7编译安装配置
  8. paip.数据挖掘--导出词库 清理太长的iptcode
  9. java 省份城市_如何用Java输入一个省份,然后列出这个省份所有城市的名字?
  10. 对10G/40Gphy中auto-negotiation功能调试
  11. 思科交换机与路由器常用基础配置
  12. 联想笔记本小新air14,键盘如何设置不用按Fn直接按F1~12、?
  13. OpenGL-入门-BMP像素图glDrawPixels
  14. Mysql varchar类型长度计算(mysql字段长度计算)
  15. java爬虫抓取极客时间专栏页面
  16. open_vins(三):imu静止初始化
  17. oracle数据库的预定义的对象类型
  18. Python实现汉诺塔代码
  19. gd32f470总结
  20. JsRender前端渲染模板-jquery方法失效

热门文章

  1. JAVA-Gson-格式化输出json字符串
  2. 直方图均衡化、自适应直方图均衡化
  3. 转行产品经理必须要知道的三件事!
  4. DRGs SQL数据库查询城镇职工医保定点医疗机构药占比
  5. Android BootLoader及两种刷机模式fastboot和recovery
  6. c语言里面的float是什么意思
  7. SonarQube代码质量管理
  8. Linux配置PHP环境
  9. Modbus的常见问题解答:多台设备如何连接?为什么要加终端电阻?RS485总线可挂接多少个设备?在RS485通讯中,最大传输距离是多少?
  10. 最大可传输单元 MTU 对 UDP/TCP 包的大小限制