函数柯里化与反柯里化
柯里化
比如想要个函数计算一个月一共花了多少钱:
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 函数的柯里化 柯里化(currying)是把接收多个参数的函数变换成为接收一个部分参数的函数,并返回接收余下参数的新函数的技术.通常这个参数是一个. 可能我们对这个解释不太明白. 现在我们来思 ...
- 浅析 JavaScript 中的 函数 uncurrying 反柯里化
柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...
- 深度学习(一)神经网络中的池化与反池化原理
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9579108.html 参考博客:https://blog.csdn.net/chengqium ...
- 深入详解python高级特性——函数柯里化(Currying)与反柯里化
前言:本章的内容本来很简单,但是涉及到的理论部分相对较多,想要彻底弄懂前因后果需要具备以下几个知识点, (1)python的高阶函数 (2)python的装饰器本质 (3)Python的functoo ...
- [CNN] 卷积、反卷积、池化、反池化
之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积.反卷积.池化.反池化的内容,也希望自己对一些比较模糊的地方可以理解的更加清晰. 一.卷积 1.卷积的简单定义 卷积神经网络中的卷积操作可以看做是 ...
- 柯里化函数(Currying),什么是柯里化,为什么要进行柯里化,高级柯里化函数的实现
柯里化(Currying) 柯里化(Currying)是一种关于函数的高阶技术.它不仅被用于 JavaScript,还被用于其他编程语言. 柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, ...
- 遍历HashMap源码——红黑树原理、HashMap红黑树实现与反树型化(三)
本章将是HashMap源码的最后一章,将介绍红黑树及其实现,HashMap的remove方法与反树型化.长文预警~~ 遍历HashMap源码--红黑树原理.HashMap红黑树实现与反树型化 什么是红 ...
- PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)
PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...
- gstat | 空间插值(三)——克里金插值之泛克里金和简单克里金
本篇接着上篇继续介绍克里金插值.首先加载相关工具包和上篇使用的示例数据: library(gstat) library(sf) library(tidyverse) library(readxl) l ...
最新文章
- 机器学习(MACHINE LEARNING)从零搭建一个汽车状态分类器(Tensorflow)
- Windows上通过bat实现不同数据库之间同步部分表的部分字段数据
- Javascript基础系列之(五)条件语句(比较操作符)
- Visual Studio的语法着色终于调得赏心悦目
- Session和Cookie的学习笔记2
- 一句话总结重构、重载、重写
- haproxy1.7编译安装配置
- paip.数据挖掘--导出词库 清理太长的iptcode
- java 省份城市_如何用Java输入一个省份,然后列出这个省份所有城市的名字?
- 对10G/40Gphy中auto-negotiation功能调试
- 思科交换机与路由器常用基础配置
- 联想笔记本小新air14,键盘如何设置不用按Fn直接按F1~12、?
- OpenGL-入门-BMP像素图glDrawPixels
- Mysql varchar类型长度计算(mysql字段长度计算)
- java爬虫抓取极客时间专栏页面
- open_vins(三):imu静止初始化
- oracle数据库的预定义的对象类型
- Python实现汉诺塔代码
- gd32f470总结
- JsRender前端渲染模板-jquery方法失效