函数是我们程序最重要的组成部分,下面我们就来回顾下函数都有哪些玩法

什么是纯函数

简单来说就是不依赖外部参数的函数:如

 const num = 2;function Fn(arg){return num*arg}// Fn 不是纯函数
function Fn2(num,arg){return num*arg
}
// Fn2 是纯函数,可以使用ES6箭头函数,让函数看起来更加简洁const Fn2 = (num,arg) => num*arg

纯函数是我们实现高阶函数的基础,我们日常写函数时也应该尽量写纯函数

什么是高阶函数

高阶函数的定义也很简单:参数是一个函数,或者返回一个函数的函数,如下函数都是高阶函数

 function Fn(fn){fn()}function Fn2(){return function(){}}

我们经常说的闭包也是高阶函数的一种,如:

 function Fn(){const num = 1;function Fn2(){ console.log(num) // 1}return Fn2}

此时,Fn2可以说是个闭包函数,Fn可以说是高阶函数

使用高阶函数封装map方法

我们常见的一些方法如map,every,some,都是ES6给我们封装好的高阶函数,那他们内部都是如果实现的呢?下面我们就模拟实现个map方法

Array.prototype.myMap = function (fn, context) {let arr = this;let temp = [];for (let i = 0; i < arr.length; i++) {let result = fn.call(context, arr[i], i, arr)temp.push(result)}return temp
}

测试

const arr = [1, 2, 3, 4]
const arr2 =  arr.myMap(item => {return item + 1
})
// 输出 [2,3,4,5]

使用高阶函数封装once方法

当需要只执行一次的函数时,我们就可以使用高阶函数来实现,如:

function once(fn) {let flag = true;return function () {if (flag) {fn()flag = false} else {console.log('已经执行过了哦')}}
}
function dome() {console.log('我要执行')
}
const d = once(dome)
d()
d()
/*
我要执行
已经执行过了哦
*/

函数柯里化

柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程,从功能上说,它实现了函数功能的细化。
下面我们先简单实现一个柯里化函数

 let Fn = (x,y)=>x+y// 使用Fn函数Fn(1,2) // 3

把Fn柯里化

let Fn = (x, y) => x + y;
const curry = (fn) => {return (x) => {return (y) => {return fn(x, y);};};
};
const fn = curry(Fn);
fn(1)(2);  // 3

可以看见,我们在使用fn函数的时候可以单个传递参数,这样更利于函数的解耦,下面我们来封装一个通用的柯里化函数,这样不管我们的参数有几个,都可以变成单一参数

const curry = function (fn) {return function curriedFn(...args) {if (args.length < fn.length) {return function () {return curriedFn(...args.concat([...arguments]));};}return fn(...args);}
}

我们使用curry

const fn = (x, y, z, a) => x + y + z + a;
const myfn = curry(fn);
console.log(myfn(1)(2)(3)(1)); // 7

curry函数实现的原理就是先把参数收集起来,然后再执行

总结

函数是编程语言的灵魂,高阶函数需要我们细细品味才能体会到编程的魅力

最后

关注微信公众号码不停息,交个朋友吧

理解高阶函数,修炼编程内功相关推荐

  1. 闭包和高阶函数-函数式编程的基本特征

    函数编程支持函数作为第一类对象,有时称为闭包或者仿函数(functor)对象.实质上,闭包是起函数的作用并可以像对象一样操作的对象.与此类似,FP 语言支持高阶函数.高阶函数可以用另一个函数(间接地, ...

  2. Kotlin 编程核心基石—高阶函数

    前言 1. 高阶函数有多重要? 高阶函数,在 Kotlin 里有着举足轻重的地位.它是 Kotlin 函数式编程的基石,它是各种框架的关键元素,比如:协程,Jetpack Compose,Gradle ...

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

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

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

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

  5. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  6. Kotlin中的高阶函数

    博客地址sguotao.top/Kotlin-2018- 在Kotlin中,高阶函数是指将一个函数作为另一个函数的参数或者返回值.如果用f(x).g(x)用来表示两个函数,那么高阶函数可以表示为f(g ...

  7. 函数传参string_JavaScript 高阶函数入门浅析

    原文:https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c ...

  8. python使用高阶函数实现_18.python高阶函数

    什么是高阶函数:一个函数可以作为参数传给另外一个函数(一个函数可以用来接收另一个函数作为参数),或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数.函数的形参位 ...

  9. react中高阶函数与高阶组件的运用—(上)(案例详细解释高阶函数)

    前言 学习react的同学多多少少对高阶组件有所耳闻,想要学好高阶组件就必须先学好高阶函数的运行,本篇文章就先从高阶函数着手,带大家学习高阶函数和高阶组件的运用 高阶函数 高阶函数(High Orde ...

  10. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

最新文章

  1. 解决ModuleNotFoundError: No module named ‘numpy.core._multiarray_umath‘ 错误
  2. LeetCode——Find the Difference
  3. Linux .bin安装文件制作
  4. c语言输入身高计算标准体重_体侧标准||身高、体重测试评分标准
  5. 交叉编译HTOP并移植到ARM嵌入式Linux系统
  6. Pick!闲鱼亿级商品库中的秒级实时选品
  7. Tensorflow源码解析2 -- 前后端连接的桥梁 - Session 1
  8. 如何将ListT转换相应的Html(xsl动态转换)(一)
  9. 【JavaScript】正则表达式 1
  10. 频繁项目集java实现_关联分析(2):Apriori产生频繁项集
  11. 极限编程XP的核心实践是什么?
  12. 多学习,C++值得看的书籍
  13. [转] 浅谈视频基础知识、视频编码、压制
  14. 如何制作一个读取U盘文件系统的工程
  15. stm32F407中arr与psc以及pwm之间的关系
  16. python爬高德地图_【爬虫】Java关于高德地图爬取数据
  17. 微信 版本android 7.0,安卓微信7.0新版对比旧版详细体验
  18. Tomcat设置环境变量
  19. 结对作业 微软学术搜索分析
  20. IT男真实的情感记录

热门文章

  1. 数据结构(C++版)校园导游咨询系统课程设计
  2. ImportError: cannot import name ‘bbox_ious‘
  3. C/C++编程日记:简单的C语言实现推箱子小游戏
  4. 唤醒手腕Python全栈工程师学习笔记(人工智能篇)
  5. Ubuntu系统修复GUID格式GPT硬盘的引导
  6. 一位“技术宅”自制的自行车码表在B站火了,稚晖君点赞,网友催量产
  7. 痱子粉(滑石粉)消除升降车窗异响;牙膏妙用( 消除雨刷异响,除浅划痕与污迹)
  8. Illustrator插件开发-AI插件-aip格式-第一章 第三小节 Plugin类-StartupPlugin函数
  9. Windows server2016 计算机管理中找不到用户和组
  10. 一名软件测试工程师的一天24小时(每天在忙什么)