参考资料: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之柯里化与偏函数的更多相关文章

  1. 函数柯里化与偏函数+bind

    简单理解: 1,函数柯里化就是把多参数函数分解为多return的单参数函数: 举个例子(伪代码): function func (a, b, c){ return } 柯里化为 function fu ...

  2. Scala学习笔记(七):Rational、隐式转换、偏函数、闭包、重复参数及柯里化

    class Rational(n: Int, d: Int) { require(d != 0) private val g: Int = gcd(n, d) val number: Int = n ...

  3. 理解JS里的偏函数与柯里化

    联系到上篇博客讲的bind完整的语法为: let bound = func.bind(context, arg1, arg2, ...); 可以绑定上下文this和函数的初始参数.举例,我们有个乘法函 ...

  4. js高阶函数应用—函数柯里化和反柯里化

    在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...

  5. js高阶函数应用—函数柯里化和反柯里化(二)

    第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...

  6. 前端进击的巨人(五):学会函数柯里化(curry)

    柯里化(Curring, 以逻辑学家Haskell Curry命名) 写在开头 柯里化理解的基础来源于我们前几篇文章构建的知识,如果还未能掌握闭包,建议回阅前文. 代码例子会用到 apply/call ...

  7. scala面向对象.高阶函数,柯里化,Actor编程简介

    1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...

  8. python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化

    函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面 ...

  9. JS 函数的柯里化与反柯里化

    ===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...

随机推荐

  1. 【LeetCode】899. Orderly Queue 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/orderly- ...

  2. 【LeetCode】436. Find Right Interval 解题报告(Python)

    [LeetCode]436. Find Right Interval 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  3. 【LeetCode】867. Transpose Matrix 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 先构建数组再遍历实现翻转 日期 题目地址:https ...

  4. 【剑指Offer】扑克牌顺子 解题报告(Python)

    [剑指Offer]扑克牌顺子 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...

  5. 【LeetCode】840. Magic Squares In Grid 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 利用河图规律 暴力解法 日期 题目地址:https: ...

  6. Codeforces 855B:Marvolo Gaunt's Ring(枚举,前后缀)

    B. Marvolo Gaunt's Ring Professor Dumbledore is helping Harry destroy the Horcruxes. He went to Gaun ...

  7. 【Web前端】css属性cursor注意事项

    注意使用cursor的url时url的括号后面必须+   ,auto: 错误示范:cursor:url('../picture/head.cur'); 正确示范:cursor: url(". ...

  8. HTML网页设计基础笔记 • 【第5章 常用的样式属性】

    全部章节   >>>> 本章目录 5.1 字体及文本属性 5.1.1 字体属性 5.1.2 文本属性 5.2 边距和填充 5.2.1 边距 5.2.2 填充 5.3 边框属性 ...

  9. Storm集群安装Version1.0.1

    Storm集群安装,基于版本1.0.1, 使用apache-storm-1.0.1.tar.gz安装包. 1.安装规划 角色规划 IP/机器名 安装软件 运行进程 nimbus zdh-237 sto ...

  10. [ vue ] xxxProject项目杂记

    2020.4.9 加入eCharts 2020.4.8 完成article的显示,其间碰到全局路由守卫写的有错误,导致跳转报错.已修复. 加入keep-alive功能,缓存视图数据 疑问:如果在全局组 ...