共计 1839 个字符,预计需要花费 5 分钟才能阅读完成。
最近在学习和工作中用到了柯里化(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 函数的性能。
// 定义高阶函数 myMap
function 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 中的高阶函数的了解和应用,置信通过下面的学习,咱们对高阶函数有了初步的意识,前面我在具体应用中如果有了新的心得和领会,也会持续和大家分享。