一、前言

在上一篇文章中我简单地提及了函数式编程中的纯函数,那么在这篇文章中就来说说偏函数,如果小伙伴们还不知道什么是纯函数或者感兴趣(有时间)的话,可以点击下方的链接~
Javascript函数式编程之纯函数

二、什么是偏函数?

  • 我个人的理解

所谓偏函数,就是固定一个函数的一个或者多个参数,返回一个新的函数,这个函数用于接受剩余的参数。听起来可能有点迷糊,没事,咱们慢慢来~
首先,我们来看一个简单的例子,下面只是一个普普通通的函数,

function add(a,b){return a + b;
}
console.log(add(1,2));//结果3
console.log(add(1,3));//结果4
console.log(add(1,4));//结果5
console.log(add(1,5));//结果6
console.log(add(1,6));//结果7
console.log(add(1,7));//结果8

不知道大家有没有发现,往add()传入的第一个参数全都是相同的,也就是1,对于这样相同的参数,我们已经重复输入了6次。参数少的情况还好办,那参数多的时候就非常不方便了,请往下看:

function add(a,b,c,d,e){return a + b + c + d + e;
}
console.log(add(1,2,3,4,5));
console.log(add(1,2,3,1,2));
console.log(add(1,2,3,3,5));
console.log(add(1,2,3,2,11));
console.log(add(1,2,3,3,8));
console.log(add(1,2,3,7,5));

那么有没有什么办法可以让我们对于相同的参数,只输入一次(也就是把他们固定住),对于其他的参数在调用的时候输入就行了呢?答案是肯定的(不然接下来我还怎么扯淡~),它就是本文的主角–偏函数!

  • 揭开偏函数的神秘面纱
    就像上面我所说的一样,偏函数是固定一个函数的一个或多个参数,然后返回一个新函数,所以我们可以定义一个函数,把它命名为partial,这个函数就相当于一个工厂,需要接受一个入参函数,这个工厂用来生产偏函数,按照这个思路,可以写出大概的构架如下:
//入参函数
function add(a,b){return a + b;
}
//生产偏函数的工厂,接受一个入参函数,返回一个新的函数,用于接受剩余的参数
function partial(fn,a){return function(b){return fn(a,b);}
}

既然生产偏函数的工厂返回了一个新的函数,所以就用一个变量去接受这个函数,然后在调用该函数的时候再把剩下的参数传入即可。具体代码如下:

//入参函数
function add(a,b){return a + b;
}
//生产偏函数的工厂
function partial(fn,a){return function(b){return fn(a,b);}
}
var parAdd = partial(add,1);//变量parAdd接受返回的新函数
console.log(parAdd(2));//在调用的时候传入剩余的参数
console.log(parAdd(3));//在调用的时候传入剩余的参数
console.log(parAdd(4));//在调用的时候传入剩余的参数
console.log(parAdd(5));//在调用的时候传入剩余的参数

固定多个参数的情况:

function add(a,b,c,d,e){return a + b + c + d + e;
}
function partial(fn,a,b,c){return function(d,e){return fn(a,b,c,d,e);}
}
var parAdd = partial(add,1,2,3);
console.log(parAdd(2,1));
console.log(parAdd(3,7));
console.log(parAdd(4,8));
  • 偏函数的原理

从上面的演示中我们可以看出,偏函数应用了闭包的原理。

三、偏函数的简单应用

  • Function.prototype.bind()

这是MDN对于bind()的描述:bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的call属性)。当新函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。
不知道大家有木有发现在上面的描述中,出现了几个很重要的表述,创建一个新函数具有相同的函数体调用时的参数被提供给模拟函数,哈哈,这不正和我刚刚说的生产偏函数工厂相似吗。所以对于上面的应用,我们还可以这样改写:

function add(a,b){return a + b;
}
var obj = {};
obj.parAdd = add.bind(obj,1);
console.log(obj.parAdd(2));//结果3

嘿嘿,是不是很神奇,小伙伴们也可以自己去尝试哦~

四、结语

好了,以上就是今天偏函数的全部内容了,有什么遗漏和错误的地方希望大家多多指正,感谢阅读!

Javascript函数式编程之偏函数相关推荐

  1. JavaScript函数式编程之偏函数(Partial Function)

    之前的博客有介绍JavaScript函数式编程的curry化,今天就介绍一个跟curry化有点像的偏函数(partial function) 先介绍一下什么叫偏函数,其实指的是将给定的函数的部分参数固 ...

  2. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  3. 一文带你了解JavaScript 函数式编程

    前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想. 本文将略去那些晦涩难懂的概念介绍,重点展示在 JavaScript 中到底 ...

  4. 一文带你了解JavaScript函数式编程

    摘要: 函数式编程入门. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函 ...

  5. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程 1

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  6. 我眼中的JavaScript函数式编程

    JavaScript 函数式编程是一个存在了很久的话题,但似乎从 2016 年开始,它变得越来越火热.这可能是因为 ES6 语法对于函数式编程更为友好,也可能是因为诸如 RxJS (ReactiveX ...

  7. JavaScript函数式编程之深入理解纯函数

    更多相关内容见博客 https://github.com/zhuanyongxigua/blog 纯函数是函数式编程的基础,需要重点理解. 纯函数的概念: 纯函数是这样一种函数,即相同的输入,永远会得 ...

  8. JavaScript函数式编程入门经典

    一个持续更新的github笔记,链接地址:Front-End-Basics,可以watch,也可以star. 此篇文章的地址:JavaScript函数式编程入门经典 正文开始 什么是函数式编程?为何它 ...

  9. JavaScript函数式编程(二)

    上一篇文章 JavaScript函数式编程(一)   里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态(我偷懒复制过 ...

最新文章

  1. 派生类的拷贝构造【C++继承】
  2. linux下GPRS ppp拨号默认路由问题(存在eth0)
  3. wxWidgets:wxFrame类用法
  4. 服务器优化:Tomcat、JVM性能调优笔记
  5. 用IStateManager管理状态
  6. 仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?
  7. php resque 计划任务,PHP-RESQUE - 实现重试
  8. 华为畅享8plus停产了吗_牢记华为手机“三不买”原则,不花冤枉钱,选错要吃亏!...
  9. 在SQL中使用PL/SQL函数存在的问题
  10. php artisan passport,API 认证解决方案:Laravel Passport
  11. 重写报销流程,责任链模式实现
  12. 信息摘要算法之二:SHA1算法分析及实现
  13. 啃老 万岁_Windows 7已死,您的杀毒软件万岁
  14. Mirth连接Sybase数据库
  15. c语言自学教程——字符函数和字符串函数
  16. PyQt设置右下角弹窗
  17. 一些图像置乱算法matlab
  18. JVM:Java内存区域和Java内存模型
  19. 这张几千人排在门外的大会门票,送你 | 来填写问卷
  20. 教程篇(7.0) 03. FortiGate安全 防火墙策略 ❀ Fortinet 网络安全专家 NSE 4

热门文章

  1. 计算e=1+1/1!+1/2!+...当1/n!<1e-7停止
  2. 使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性
  3. endo-BCN-PEG4-Palmitic,环丙烷环辛炔四聚乙二醇-Palmitic包装灵活
  4. Spring中使用RabbitMQ
  5. 十个程序员必备的技术网站,感谢分享
  6. 浏览器调试webview
  7. 云计算时代必备技术:内网穿透详解
  8. 罗技 (Logitech) USB 网络摄像头 - 示意图素材
  9. ChinaJoy现场直击:惠普引领玩家“玩出内力”
  10. 基于麻雀搜索算法优化的lssvm回归预测