JavaScripts之柯里化与偏函数
参考资料:https://github.com/mqyqingfeng/Blog/issues/42
柯里化(Currying):
定义:柯里化是表示将某个多参数的函数转换为一系列只有一个参数的函数的技术。
优点:
1. 参数复用
2. 延迟执行
3. 函数式编程(具体没有深入了解)
缺点:由于 柯里化 离不开使用 闭包、arguments、递归,会产生额外的开销
1. 闭包:会导致变量都会存储在内存中,无法被GC回收,管理不当容易造成内存泄漏
2. arguments 存储慢、访问性差
3. 递归执行效率低
实例:
// 实现一个柯里化函数
function curry(fn) {
const args = arguments[1] || [] return function (arg) {
arg && args.push(arg)
// 这里也可以对 fn.length 与 args.length 进行判断,若长度相等则自动执行
if(!arg) {
return fn.apply(this, args)
} return curry.call(this, fn, args)
}
} function sum (a, b, c) {
return a + b + c
} const curryFn = curry(sum)
// 参数复用 延迟执行
let c = 1
const fn1 = curryFn(1, 2)
console.log(fn1(c)()) // 输出 -> 4
c++
// 这里 a=1,b=2 参数就复用了
const fn2 = fn1(c) // fn1(c) 返回的是一个可执行函数,我们没有直接进行调用,延迟执行(当然也可以当参数数量满足条件时自动执行)
console.log(fn2()) // 输出 -> 5
偏函数(局部应用):
定义:将一个有n个参数的函数(n元函数)转换为 n - x 个参数的函数(n - x 元函数)
作用:可以为一些某些参数为固定的函数提供一个函数变体,调用更简单
实例:
// 简单的偏函数实现
function partial(fn) {
const _args = [].slice.call(arguments, 1) return function() {
_args.push(...arguments)
if(_args.length >= fn.length ){
return fn.apply(this, _args)
}
return partial(fn, ..._args)
}
} function add (a, b, c) {
return a + b + c
} // 我们将 add(a, b, c) ->转化为了 newAdd(b, c)
// newAdd 就是一个偏函数
const newAdd = partial(add, 1)
console.log(newAdd(2, 3))
柯里化与偏函数区别:
柯里化是将 n元函数 转换为 n个1元参数, 而偏函数是将 n 元函数 转换为 n - x 个参数(n元函数:n个参数的函数;n - x:n个参数 减去 x个参数)
JavaScripts之柯里化与偏函数的更多相关文章
- 函数柯里化与偏函数+bind
简单理解: 1,函数柯里化就是把多参数函数分解为多return的单参数函数: 举个例子(伪代码): function func (a, b, c){ return } 柯里化为 function fu ...
- Scala学习笔记(七):Rational、隐式转换、偏函数、闭包、重复参数及柯里化
class Rational(n: Int, d: Int) { require(d != 0) private val g: Int = gcd(n, d) val number: Int = n ...
- 理解JS里的偏函数与柯里化
联系到上篇博客讲的bind完整的语法为: let bound = func.bind(context, arg1, arg2, ...); 可以绑定上下文this和函数的初始参数.举例,我们有个乘法函 ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
- 前端进击的巨人(五):学会函数柯里化(curry)
柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...
- scala面向对象.高阶函数,柯里化,Actor编程简介
1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...
- python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化
函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面 ...
- JS 函数的柯里化与反柯里化
===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...
随机推荐
- spoj-ORDERS - Ordering the Soldiers
ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...
- B. The Meeting Place Cannot Be Changed
B. The Meeting Place Cannot Be Changed time limit per test 5 seconds memory limit per test 256 megab ...
- matplotlib 进阶之Tight Layout guide
目录 简单的例子 Use with GridSpec Legend and Annotations Use with AxesGrid1 Colorbar 函数链接 matplotlib教程学习笔记 ...
- 网易云 微专业C++系统工程师
网易云 微专业C++系统工程师 一.学前基础 1.曾经学过某种编程语言(C语言最佳) 2.了解基本的变量.类型.作用域.循环和控制流程:了解基本数据类型(整数.浮点.字符串.数组等) 3.知道如何编译 ...
- Kylin安装Version1.6.0
Kylin安装,基于版本1.6.0,Kylin只有单机没有集群, 使用apache-kylin-1.6.0-hbase1.x-bin.tar.gz安装包. 1.安装规划 角色规划 IP/机器名 安装软 ...
- python接口自动化,从excel取param的内容太多,使用eval转换报错'EOL while scanning string literal
背景: 做接口自动化时,有个接口的参数内容很多,可以从excel中读取出来,但是在eval()进行转化时,就报错"'EOL while scanning string literal&quo ...
- Git_同一个本地仓库上传到不同的远端仓库(github、gitee)
一.背景 github访问.推拉代码都太慢了,于是想把github上面的项目全部迁移到gitee(码云)上,但又不想放弃在github上维护项目,于是想同时维护两个远端仓库 二.准备工作 1.创建相同 ...
- Flask_环境部署(十六)
flask自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容器,来部署flask程序并使用 Nginx 做前端代理实现分流.转发.负载均衡,以及分担服务器的压力. Gunicor ...
- 苹果系统 的 qq浏览器 和 qq内置浏览器 无法使用 websocket 的 妥协方案
没错,就是用不了,js脚本不执行,更别说服务器运行 onopen函数了!!! 怎么办...搞了一天,仍然找不到连接的方法!!! 幸运的是仅仅苹果系统 的无法使用 ,安卓的却可以,奇了怪了 哈皮 ,那我 ...
- Hadoop学习-块、网络拓扑、副本策略、机架感知
原文链接:https://www.toutiao.com/i6627682068203586062/ 一.我们先看一个大数据的实例 进到官网 我们进入到里面有个"网站统计" 我们查 ...