函数柯里化
-
函数柯里化就是函数的一种使用方法,个人理解就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数,上代码:
function currery(fn) {
let args = [].slice.call(arguments,1)
return function() {
let newArgs = [].slice.call(arguments)
let allArgs = args.concat(newArgs)
//如果没有传参数则直接返回结果 if(arguments.length === 0) {
return fn.apply(null, allArgs)
}
// 继续柯里化 return currery.call(null,fn, ...allArgs)
}
}
function add (a,b,c) {
return a + b +c
}
let add1 = currery(add,1)
console.log(add1(9,8)())//18console.log(add1(2)(3)(4)()) //6 -
从上面代码可以看出,柯里化具有使函数参数复用和延迟执行的能力,另外一个能力是函数可以提前返回,比如我们需要需要添加监听事件,但是不知道目前浏览器是使用哪种监听事件,就可以通过函数柯里化判断使用哪一种,然后直接返回对应的函数,就不需要每次调用都要判断。
高阶函数
- 高阶函数有两个特点
-
可以接收一个或多个函数作为参数
-
也可以返回一个函数
Array.prototype.myMap = function(fn) {
let result = []
for(let i=0; i < this.length; i++) {
let item = this[i]
let index = i
result.push(fn(item, index, this))
}
return result
}
let arr = ['I','LOVE','JS']
let k = arr.myMap((item, index, arr) => {
console.log(arr)
console.log(item)
return item+"1"
})
console.log(k)
- 上面的代码就是使用高阶函数实现的数组的map方法,类似的高阶函数还有很多,其实高阶函数就是你传一个数据预处理的函数给高阶函数,然后高阶函数把处理结果或者函数返回给你。