最终效果:

var greet = function(greeting, name) {return greeting + ' ' + name;
};var sayHelloTo = _.partial(greet, 'hello');
sayHelloTo('fred');
// => 'hello fred'

来自:http://lodashjs.com/docs/#_partialfunc-partials

除非你已经使用过其他的函数式编程,不然你可能对下面这两个概念很陌生:“偏函数应用”和“函数柯里化“。

偏函数应用,英文是partial application,也可以译作“局部应用”、“部分应用”、“偏应用”
函数柯里化,英文是currying,也可以译作“局部套用”、“加里化”、“卡瑞化”

话虽如此,但是假如你一旦理解了这两个概念,你就完全可以在自己的代码里使用他们。

Functions

即使你已经很熟悉JavaScript的function, 知道function可以作为返回值,可以作为参数。
但是我还是推荐你读一下这个第一部分。如果不需要,也可以跳过,直接看局部应用的章节。

我们首先看一个非常基础的例子:

function add(a, b) { return a + b; } add(1, 2); // 3 add(1, 3); // 4 add(1, 10); // 11 add(1, 9000); // 9001 

尽管上面的例子是非常的简单,但是还是演示出了我们反复调用一个function的场景,并且每次传入的第一个参数都是相同的,在上面的代码里就是数字1

Functions返回Functions

我们也可以创建一个叫做makeAdder的function,这个function会返回另一个可以传入参数的function。(像这种可以用来创建其他function或object的function,一般会叫做工厂 - factories)

返回的函数,如果往里面传入参数调用,可以把传入的参数值和原来设的参数值,返回相加的结果。

// More general function.
function add(a, b) { return a + b; } add(1, 2); // 3 add(10, 3); // 13 // More specific function generator. function makeAdder(a) { return function(b) { return a + b; }; } // More specific functions. var addOne = makeAdder(1); addOne(2); // 3 addOne(3); // 4 var addTen = makeAdder(10); addTen(2); // 12 addTen(3); // 13 

上面的代码之所以可行,是因为JavaScript支持闭包的功能,由于闭包的存在,使得function可以访问到这个function外部的变量,甚至在调用这个function时的作用域的外层。

除此之外,在JavaScript里面,function是一等公民。正因为如此,function可以接受function作为参数,也可以返回function.

闭包和函数这个一等公名经常一起配合着工作:使得返回的function可以继续使用传入的参数。

上面的代码给我们提供了一些方便,我们可以不再使用add(1, 2),而直接使用addOne(2),但是实现这个并不是不需要付出代价的。

首先,实际做加法的逻辑在上面两个例子的代码中还是重复的,这样还是会有些问题。

其次,对每个类似于上面的加法场景,用这种方式去独立除不同的逻辑,我们将需要手工创建makeSomething的工厂function。

Functions接受Functions

下面的逻辑步骤是创建一个更普遍的工厂function,不仅接受一个要绑定的参数,也会接受一个function,这个function里面包含了所有的核心逻辑。(传入到其他function的function,一般被成为回调函数-callbacks)

用这种方式,一个单独的工厂function能够被用来创建function绑定。

注意,原始的function被没有被更新,并且他们的行为也不会改变。他们很容易被调用。

// Relatively flexible, more specific function generator.
function bindFirstArg(fn, a) { return function(b) { return fn(a, b); }; } // More general functions. function add(a, b) { return a + b; } add(1, 2); // 3 function multiply(a, b) { return a * b; } multiply(10, 2); // 20 // More specific functions. var addOne = bindFirstArg(add, 1); addOne(2); // 3 addOne(3); // 4 addOne(10); // 11 addOne(9000); // 9001 var multiplyByTen = bindFirstArg(multiply, 10); multiplyByTen(2); // 20 multiplyByTen(3); // 30 multiplyByTen(10); // 100 multiplyByTen(9000); // 90000 

上面这段代码,亮点不在于它可以将某个参数绑定到任意的function,并且这个参数作为绑定的function的第一个参数,它还能将方法绑定它自己身上作为第一个参数,因此创建了一个可绑定的function

想想这种情况:假如bindFirstArg能够将第一个参数绑定到一个function,但是这个function可以接受两个参数,比如传进去1和10,1用来加,10用来乘。
bindFirstArg可以接受两个2参数,假如第一个参数是它自己,也就是bindFirstArg可以用来绑定它自己。

看下面的例子:

// More specific function generator.
var makeAdder = bindFirstArg(bindFirstArg, add);// More specific functions.
var addOne = makeAdder(1); addOne(2); // 3 addOne(3); // 4 var addTen = makeAdder(10); addTen(2); // 12 addTen(3); // 13

转载于:https://www.cnblogs.com/bonelee/p/6102535.html

javascript里的偏函数——本质函数式编程+闭包,返回函数相关推荐

  1. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 目录 JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 1.纯函数 1.1.纯函数的概念 1.2.副作用 1.3.纯函数 ...

  2. 函数式编程:一等函数(First-class Function)

    函数式编程:一等函数(First-class Function) 说起函数式编程,不得不提的是First-class Function的概念,有些文章把它翻译成"第一类函数",有些 ...

  3. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)

    编程范式: 命令式编程/声明式编程 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数) 高阶函数 filter/map/reduce filter中的回调函数有一个要求: 必须返 ...

  4. python学习——函数式编程——高阶函数

    python学习--函数式编程--高阶函数 函数式编程(高阶函数):1:map && reduce; 2 : filter; 3: sorted; ------------------ ...

  5. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊...

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  6. 【一天时间|JavaScript进阶】函数式编程高阶函数的应用

    一天时间系列文章是博主精心整理的面试热点问题和难点问题,吸收了大量的技术博客与面试文章,总结多年的面试经历,带你快速并高效地审视前端面试知识.直击技术痛点,主动出击,精密打击,这才是面试拿到高薪的秘诀 ...

  7. python函数式编程:匿名函数,装饰器,偏函数

    一 匿名函数: 尽管python的语法已经很简洁,但是定义函数的过程还是相对繁琐,当我们在调用函数的过程中,python为我们提供了可以节省定义函数时间的方法,让我们可以不用显示的调用函数,那就是匿名 ...

  8. python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

    1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...

  9. 函数式编程4-高阶函数

    以其他函数作为参数的函数 本章的所有代码,均在github.com/antgod/func- 关于传递函数的思考 max 在很多编程语言的核心库,都包含一个叫做max的函数.包括underscore也 ...

最新文章

  1. Linux 工具进阶
  2. MATLAB_8-边缘检测_demo.m[课堂齿轮作业]其他的在文章末尾
  3. 黑客与画家:11 一百年后的编程语言
  4. Spring Boot 应用迁移到 Java 11
  5. 入侵无需密码? 雅虎数据泄露调查新进展
  6. Variational Inference
  7. 将.protobuf文件转成.cs文件方法
  8. 静态变量的多线程同步问题
  9. Compile a native C Android application
  10. JS组件系列——封装自己的JS组件
  11. 如何提升大数据分析能力
  12. Javascript数据类型,类型转换
  13. MyEclipse Hibernate反向工程生成实体类
  14. 计算机硕士工资一览表 (时间有点久远了)
  15. 【论文阅读笔记】Securing software by enforcing data-flow integrity
  16. HDMI 分配器正确使用方法
  17. 中科院信工所经验_信工所六室面试经历
  18. 微软校园招聘面试经历
  19. 金融风险管理 思维导图
  20. 外贸网站建设需要注意的事项

热门文章

  1. DuiLib——xml节点元素属性介绍
  2. 服务器收集错误信息0不动,win10系统提示“我们只收集某些错误信息”的解决方案...
  3. openwrt安装oracle,Openwrt安装软件的方法-tomcat 随笔小记-install ubuntu 12.04 in virtualbox_169IT.COM...
  4. asp.net ajax聊天室,ASP.NET MVC4异步聊天室的示例代码
  5. java中运用抽象_如何学会java中的抽象应用
  6. 多选月份的日期选择器_GitHub - ylmyg/SelectionTime: Android下日期选择器,支持范围选择、多选、单选、根据输入天数选择日期...
  7. DLPack构建跨框架深度学习编译器-实现张量之间的相互转换【pytorch】
  8. tmux远程服务器训练
  9. python【力扣LeetCode算法题库】面试题62- 圆圈中最后剩下的数字(约瑟夫环)
  10. linux7怎么查看rsync状态,linux – Rsync显示单个文件的进度