函数柯里化

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

方便的理解

我们将一个接受多个参数的函数fn(a, b, c)转换成可以一个一个接受参数的函数fn(a)(b)(c),如果要执行该函数,所需参数传满即可fn(a)(b)(c)

举个例子:

let fn1 = function (a, b, c) {return a + b + c
}console.log(fn(1, 2, 3)) // 6let fn2 = currying(fn1);console.log(fn2(1)) // function(){...}
console.log(fn2(2)) // function(){...}
console.log(fn2(3)) // 6
console.log(fn2(3)(4)(5)) // 12

这里我们将函数fn1带入函数currying中,返回出来的函数fn2就是被柯里化后的函数。

当我们传入前两个参数的时候,函数fn2并不会立即计算,而是返回一个函数。当我们继续向函数内传入参数到达三个时,函数才会返回值。

currying化的好处

1. 参数复用

这个很好理解,在上面的例子中,如果我们将fn2(1)返回的函数复制给一个变量,我们就复用了这里的参数1

let fn1 = function (a, b, c) {return a + b + c
}let fn2 = currying(fn1);
let fn3 = fn2(1)(2);console.log(fn3(3)) // 6
console.log(fn3(4)) // 7
console.log(fn3(10)) // 13
console.log(fn3(30)) // 33

2. 延迟计算

我们经常使用的Function.prototype.bind的实现机制就是柯里化。

Function.prototype.bind = function (context) {var _this = thisvar args = Array.prototype.slice.call(arguments, 1)return function() {return _this.apply(context, args)}
}

3. 动态生成函数

假设我们有一个函数,需要通过判断来执行不同的代码块。

let on = function(element, event, handler) {if (document.addEventListener) {if (element && event && handler) {element.addEventListener(event, handler, false);}} else {if (element && event && handler) {element.attachEvent('on' + event, handler);}}
}

这样写显然不太优雅,我们换一种写法。

let on = function(isSupport = document.addEventListener, element, event, handler) {if (isSupport) {return element.addEventListener(event, handler, false);} else {return element.attachEvent('on' + event, handler);}
}

发现什么了吗?

如果此时我们将on函数柯里化,就可以动态生成针对不同环境的事件监听函数了。

柯里化实现

那么,我们如何来实现一个柯里化的函数呢?

function curryIt(fn) {// 参数fn函数的参数个数var n = fn.length;var args = [];return function(arg) {args.push(arg);if (args.length < n) {return arguments.callee; // 返回这个函数的引用} else {return fn.apply(this, args); // 调用函数}};
}

bind函数返回值-1_javascript函数柯里化相关推荐

  1. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

  2. Python基础day05【函数(局部变量、全局变量、多函数执行流程、函数返回值、函数参数)、拆包、引用、可变与不可变类型、函数注意事项】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day05[函数(函数传参的两种形式.函数形参).拆包.引用.可变与不可变类型.引 ...

  3. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  4. python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)

    1. 变量作⽤域         变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量. 局部变量         定义在函数体内部的变量,即只在函数体内部⽣效. def testA(): ...

  5. python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)

    1. 函数的作⽤ 函数就是将⼀段具有独⽴功能的代码块整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求. 函数在开发过程中,可以更⾼效的实现代码重⽤. 2. 函数的使⽤步骤 2.1 定义 ...

  6. 函数指针,函数指针数组,函数返回值为函数指针

    函数的名字就是函数的首地址:定义函数指针; int (*p)(int )     p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以 ...

  7. linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数

    信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...

  8. python open函数返回值_open函数 · intermediate-python · 看云

    # open函数 # `open`函数 [open](http://docs.python.org/dev/library/functions.html#open) 函数可以打开一个文件.超级简单吧? ...

  9. python sort函数返回值_lambda函数与箭头函数在集合内置函数应用中的对照学习

    Python语言中有一个定义轻量级规则的lambda函数,其语法格式为: Lambda 参数列表:返回值表达式 简单的例子如:定义func=lambda x,y:x+y,则调用func(10,20)的 ...

最新文章

  1. 2022斯坦福AI指数报告出炉!中国霸榜AI顶会,但引用量最低
  2. 组件Refs(操作DOM的2⃣️两种方法)
  3. 任务调度(三)——Timer的替代品ScheduledExecutorService简介
  4. 转: Linux下单网卡多vlan多虚拟机
  5. perl调用shell
  6. G1垃圾收集器之RSet
  7. 确认了!华为P30 Pro包装盒曝光:后置四摄+水滴屏
  8. CCF CSSP202009-1称检测点查询
  9. FFT(FastFourier Transform,快速傅立叶变换)
  10. 防止被偷窥和修改 Office文档保护秘笈
  11. 51单片机——LED点阵
  12. Heartbeat安装部署
  13. 解决MATLAB新版本中modem.qammod作废的问题
  14. HDU6287 口算训练(唯一分解定理+二分)
  15. 【出差总结】出差0902
  16. 手推遗传算法(Genetic Algorithm,GA)的详细步骤图解
  17. Kindeditor 图片粘贴上传后设置图片属性
  18. 浏览器新建标签页被篡改
  19. 消除E680I/E680/E680G/A780手机联网提示框
  20. 计算机学院的迎新晚会,计算机学院举办迎新晚会

热门文章

  1. iOS UIDatePicker设置为中文的方法
  2. 微积分28-复合函数与隐函数的微分法
  3. Atom 备份神器 —— Sync Settings
  4. wifi的web 认证。
  5. IOS NSUserDefaults 讲解 用法
  6. 从技术角度看人人网,互联网营销
  7. h3c ospf stub total stub nssa
  8. redis怎么开启_关于Redis数据库入门必备的学习点
  9. brew 安装php7.1.6_mac上通过brew安装php7
  10. 【论文写作】SSM房屋租赁系统如何写设计总结