最近在学习和工作中用到了柯里化(curry),而柯里化是高阶函数(High-order Fucntion)的一种实现形式。为了更好的学习和了解D3js的编程形式,先把高阶函数的概念好好理分明。

1,高阶函数的定义

高阶函数(High-order Fucntion),是一个能够接管另一个函数作为参数,或者将另一个函数作为输入返回的函数。
或者说:高阶函数是能够对其余函数进行操作的函数,这种操作能够是把其余函数作为参数输出,也能够是把其余函数作为返回输入。

另外,咱们还须要理解两个概念,函数式编程和一等函数。
函数式编程(Functional Programming),是一种编程模式,将函数作为参数传给其余函数,或者将函数作为值返回,这样的编程模式就是函数式编程。由此能够看出,高阶函数就是函数式编程的一种实现。
一等函数(First-class Function) 或者头等函数,是指当函数能够被当做变量一样应用(函数能够被其余函数传入或返回,也能够被赋值给其余变量),就称这种编程语言领有一等函数。在Javascript语言中,函数是被当做一种对象,能够被当做参数传入,也能够被当做返回值,还能够赋值给其余变量,因而咱们说Javscript语言有一等函数。

2,应用高阶函数

下面咱们讲了高阶函数相干的概念定义了,当初咱们来理论应用高阶函数,来领会高阶函数能给咱们带来什么。

首先咱们来实际一下Javascript自带的高阶函数,例如Array.prototype.map和Array.prototype.reduce这两个数组办法。

首先看一下Array.prototype.map的应用。咱们有一个数组arr=[1,2,3,4,5],假如咱们想得到另一个数组arr2,咱们心愿数组arr2是数组arr中每个元素的值乘以2的值的汇合。如果不应用高阶函数,咱们就要这样去实现:

const arr = [1,2,3,4,5]const arr2 = []for(let i = 0, len = arr.length; i < len; i++) {  arr2.push(arr[i] * 2)}console.log('arr2:',arr2)

应用数组的map办法咱们就能够这样:

const arr = [1,2,3,4,5]const arr2 = arr.map(item => item *2)console.log('arr2:',arr2)

代码是不是很简洁?
其中 item => item * 2(item) => { return item * 2 } 这个箭头函数的简写模式。能够看到,map这个函数的参数也是一个函数,如果齐全开展的话,代码是这样的:

const arr = [1,2,3,4,5]function doubleFn(item) {  return item * 2}const arr2 = arr.map(doubleFn)console.log('arr2:',arr2)

接下来,让咱们本人来写一个myMap高阶函数,来实现原生map函数的性能。

// 定义高阶函数 myMapfunction myMap(arr, fn) {  const newArr = []  for(let i = 0, len = arr.length; i < len; i++) {    newArr.push(fn(arr[i]))  }  return newArr}// 应用高阶函数const arr = [1,2,3,4,5]const arr2 = myMap(arr, item => { return item * 2 })console.log('arr2:',arr2)

方才咱们探讨的map函数,是把另外一个函数作为参数值输出了,上面咱们再看一个把函数当做返回值输入的例子。

function multiply(num) {  return function(times) {    return num * times  }}const result = multiply(10)(5)console.log('result:', result)

这个例子里,myltiply这个函数,返回的是一个匿名函数。这个匿名函数实现了对数字的乘法运算。当咱们应用myltiply(10)的时候,咱们失去的是外面的利用函数自身。所以当咱们应用multiply(10)(5),就运行了这个匿名函数,并传入了两次参数10和5,最终返回了乘法的后果。


以上就是对Javascript中的高阶函数的了解和应用,置信通过下面的学习,咱们对高阶函数有了初步的意识,前面我在具体应用中如果有了新的心得和领会,也会持续和大家分享。