参考资料: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】373. Find K Pairs with Smallest Sums 解题报告(Python)

    [LeetCode]373. Find K Pairs with Smallest Sums 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/p ...

  2. golang切片的一些自问自答

    你好,我是轩脉刃.这篇是关于go切片的一些问题和回答. go的切片基本上是代码中使用最多的一种数据结构了,使用这种数据结构有哪些要注意的点,这个是非常必要了解的东西.基本上,以前写的一篇博客 http ...

  3. 【Java例题】5.2 数组转换

    2. 有一个一维数组由键盘输入,据输入的m和n,将其转换为m*n的二维数组. package chapter5; import java.util.Scanner; public class demo ...

  4. SHARPENING (HIGHPASS) SPATIAL FILTERS

    目录 Laplacian UNSHARP MASKING AND HIGHBOOST FILTERING First-Order Derivatives Roberts cross-gradient ...

  5. Momentum and NAG

    目录 Momentum Nesterov accelerated gradient NESTEROV 的另外一个方法? Momentum Momentum的迭代公式为: \[v_t = \gamma ...

  6. 牛掰,在IDEA中,你可以安装小傅哥写的插件了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.承认你优秀很难 很多码农,把路走窄了 捧一个,喷一个,很多码农都不会多一点思路看问题,总是 ...

  7. IIS部署php项目——discuz论坛

    1.安装CgiModule模块 首先,IIS要部署php项目,需要CgiModule模块的支持,所以首先我们要确认这个模块是否存在 打开IIS管理器: 我这里是存在的: 如果不存在,可以自行在控制面板 ...

  8. C# .net 环境下使用rabbitmq消息队列

    消息队列的地位越来越重要,几乎是面试的必问问题了,不会使用几种消息队列都显得尴尬,正好本文使用C#来带你认识rabbitmq消息队列 首先,我们要安装rabbitmq,当然,如果有现成的,也可以使用, ...

  9. websocket 使用 spring 的service层 ,进而调用里面的 dao层 来操作数据库 ,包括redis、mysql等通用

    1.前言 描述一下今天用websocket踩得坑  --->空指针异常! 我想在websocket里面使用service 层的接口,从中获取数据库的一些信息  , 使用 @Autowired 注 ...

  10. react将HTML字符串解析为HTML标签

    当后台返回的数据是字符串html的话,我们可以利用dangerouslySetInnerHTML属性来把字符串转换成html标签 function showhtml(htmlString){ var ...