参考资料: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 1482. 制作 m 束花所需的最少天数

    LeetCode 1482. 制作 m 束花所需的最少天数 题目 给你一个整数数组 bloomDay,以及两个整数 m 和 k . 现需要制作 m 束花.制作花束时,需要使用花园中 相邻的 k 朵花 ...

  2. Java生成随机数的4种方式

    Random Random 类诞生于 JDK 1.0,它产生的随机数是伪随机数,也就是有规则的随机数.Random 使用的随机算法为 linear congruential pseudorandom ...

  3. 【嵌入式】arduino常用函数

    IO函数 设置引脚 pinMode(0-13,INPUT/OUTPUT/INPUT_PULLUP) 设置输出 digitalWrite(0-13,HIGH/LOW) 读取引脚 digitalRead( ...

  4. capstoneCS5213|HDMI转VGA带DAV模拟音频输出转换器|CS5213方案

    capstone CS5213是一款HDMI到VGA转换器结合了HDMI输入接口和模拟RGB DAC输出且带支持片上音频数模转换器.CS5213芯片设计简单,整体芯片尺寸精悍,外围电路集成优化度较高, ...

  5. Java初学者作业——编写Java程序,输入一个学生的5门课程的成绩,求其平均分。

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个学生的5门课程的成绩,求其平均分.计算平均成绩,需要将每一门课程的成绩逐步累加到总成绩中,使用 for 循环实现,然后求出平均分. 实现 ...

  6. netty系列之:netty对SOCKS协议的支持

    目录 简介 SocksMessage Socks4Message Socks5Message 总结 简介 SOCKS是一个优秀的网络协议,主要被用来做代理,它的两个主要版本是SOCKS4和SOCKS5 ...

  7. PHP 中的闭包函数和匿名函数

    闭包函数 闭包函数通常作为函数中的函数使用. <?php $foo = function($s) { echo $s; }; $foo('hello'); <?php function t ...

  8. js 鼠标经过和经过离开 导航实战案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 解决VirtualBox 运行时报内存不能written

    在VirtualBox 虚拟机中安装系统的时候,突然报"0x00000000指令,该内存不能written",只能强制停止,这个问题要怎么解决呢? 解决办法是恢复系统主题3个dll ...

  10. Flask_Flask-Migrate数据迁移扩展(十二)

    在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据.更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中. ...