之前的博客有介绍JavaScript函数式编程的curry化,今天就介绍一个跟curry化有点像的偏函数(partial function)

先介绍一下什么叫偏函数,其实指的是将给定的函数的部分参数固定化,然后返回新的函数举个例子比如

这是数学里的多元函数,我们固定其部分参数,那么就可以得到新的函数,比如这种

仔细想想curry化,其实是一种特殊的偏函数,它固定参数的顺序只能是从左往右,然后返回新函数

了解了概念,我们来动手实现这个偏函数

给出多种实现方式(纯属自己无聊)

es5实现


//es5实现
function partial(fn){var args = Array.prototype.slice.call(arguments); //将类数组对象arguments转为数组args.shift();                                     //除去fn参数for (var i = args.length;i<fn.length;i++)         //补齐,跟fn的参数列表对应上args.push(undefined)return function() {var remainArgs = Array.prototype.slice.call(arguments), // 剩余参数index = 0;for (i = 0; i < args.length; i++) {args[i] === undefined && (args[i] = remainArgs[index++])}return fn.apply(this,args);}
}

通过个Function添加原型链的方式实现 es5版

//通过个Function添加原型链的方式实现 es5版
Function.prototype.partial = function() {var args = [].slice.call(arguments),that = this;for (var i = args.length;i<that.length;i++)         //补齐,跟fn的参数列表对应上args.push(undefined)return function() {var remainArgs = [].slice.call(arguments),index = 0;args.forEach(function(arg,i){arg === undefined && (args[i] = remainArgs[index++])})return that.apply(this,args)    }
}

es6实现

//es6实现
const partial_es6 = (fn,...args) => {for (let i = args.length;i<fn.length;i++)         //补齐,跟fn的参数列表对应上args.push(undefined)return (...remainArgs) => {let j = 0;args.forEach((arg,i) => arg === undefined && (args[i] = remainArgs[j++]))return fn(...args) }
}

通过个Function添加原型链的方式实现 es6版

//通过个Function添加原型链的方式实现 es6版
Function.prototype.partial_es6 = function(...args){for (let i = args.length;i<this.length;i++)         //补齐,跟fn的参数列表对应上args.push(undefined)return (...remainArgs) => {let j = 0;args.forEach((arg,i) => arg === undefined && (args[i] = remainArgs[j++]))return this(...args)  }
}

使用如下


function add4(a,b,c,d) {return a + b + c + d;
}var _add4 = add4.partial(1,undefined,3,undefined);console.log(_add4(2,4)); // 1 + 2 + 3 + 4 = 10 

那么偏函数还有啥用呢,再来个最简单的例子,比如setTimeout(fn,time)这个函数,那么我们可以固定后面的time参数,这样我们就可以得到很多时间间隔一样的setTimeout函数‘

var setTimeout_1s = partial(setTimeout,undefined,1000);setTimeout_1s(function(){//do something
});
setTimeout_1s(function(){//do something
});

有了这个例子,剩下的应用读者可以自己想想

JavaScript函数式编程之偏函数(Partial Function)相关推荐

  1. Javascript函数式编程之偏函数

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

  2. javascript 函数式编程(1)

    函数式编程(Functional Programming) 简单说就是把函数当参数传递给其他函数.个人认为 FP 在软件抽象中占很重要的地位,作为程序员的话极力推荐掌握其中的思维方法.最早这思想出现在 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. javascript函数式编程上

    我们一起来学习javascript函数式编程 文章目录 前言 一.函数式编程是什么? 二.专业术语 1.纯函数 2.纯度和幂等性 3.偏应用(partial application)函数 4.函数的柯 ...

最新文章

  1. 树莓派3B 安装中文输入法谷歌输入法途中碰到的各种问题
  2. java基础提升篇:synchronized同步块和volatile同步变量
  3. 网络爬虫re模块的findall()函数
  4. 轻量级日志采集系统Loki+grafana搭建
  5. 明年,5G iPhone不只一款!
  6. RocketMQ-PushConsumer配置参数详解
  7. matlab设计凸轮轮廓代码_数控铣床搞定曲轴、凸轮轴粗加工的奥秘、高招与绝对细节经验...
  8. Atitit js版本es5 es6新特性
  9. 自然语言处理(NLP)-第三方库(工具包):AllenNLP【用于构建各种NLP模型的库;基于PyTorch】
  10. matlab 蜗杆轮廓,基于MATLAB的直廓环面蜗杆的可视化
  11. WDI面板数据(1990-2020)
  12. 十亿级别的MySQL数据库表(InnoDB存储引擎),旧数据清理的蹩脚方案。
  13. ROS2学习(1)ROS2简述
  14. bugku 二维码题目 多种方法解决、闪的好快、乌云邀请码
  15. 计算机入门模拟试卷c卷,《计算机入门》模拟卷C答案-华东师范大学.doc
  16. 形态学操作——开运算与闭运算
  17. QQ在线图标 离线 QQ开通在线QQ服务 QQ陌生人直接聊天
  18. 吃饭时候的调侃 起起伏伏的情感 有惊喜、低落、 悲伤、
  19. 学会读源码,很重要!
  20. 公交卡管理系统C语言,关于NFC不能刷公交卡的研究(暂无方法)

热门文章

  1. PreferenceCategory背景颜色设置
  2. 小学计算机键盘指法课件,小学信息技术《键盘与指法》教学设计
  3. 【大数据学习之路之hive】
  4. Android-Gallery画廊
  5. 开源虚拟化工具VirtualBox安装部署
  6. LAMP架构之nginx:nginx重定向+防盗链
  7. 严重: maxIdle is deprecated,严重: testWhileIdle is true, validationQuery not set,Druid连接池连接MSQL报错处理
  8. sencha touch 在新版谷歌浏览器中painted事件无法触发解决方案以及carousel 控件、togglefield控件、滚动条失效...
  9. mmsegmentation使用教程 使用 OpenMMLab 的 MM segmention 下Swin-T 预训练模型 语义分割 推理的记录
  10. 棋逢对手 — XPS 15 2020 横评 MacBook Pro 16