一、什么是高阶函数?
JavaScript的函数都指向某个变量,变量可以指向函数,函数的参数又能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
二、什么是柯里化?
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。(度娘)
就个人理解,柯里化函数执行时产生一个闭包,把一些信息预先存储起来,目的是供上下文使用。这样预先存储和处理,就是函数的柯里化。
三、函数柯里化的应用
常见面试题
add(1)(2)(3) = 6;
add(1,2,3)(4)=10;
add(1)(2)(3)(4,(5))=15;
- 先了解一个知识点:
1. 调用函数加括号fn():执行函数体fn,执行后得到其返回值;
2. 调用函数不加括号fn:不会执行函数体,而是得到函数体的源码。函数名起始就是指向函数的指针,它知识传递了函数体所在的地址位置,在需要执行时找到函数体去执行;
function add() {
// let args = arguments;// 把保存变量的arguments赋值给args保存起来
// 注意arguments是对象 进行数组转换
let args = Array.prototype.slice.call(arguments);
let inner = function () { // 这个内部函数起始就是接收第二次传入的参数
args.push(...arguments)
let sum = args.reduce((prev, cur) => {
return prev + cur
})
return sum //确定返回内容
}
return inner //返回内部函数实现基本的柯里化
}
console.log(add(1)(2));// 每次增加一个括号,都需要增加一个内部函数
- 增加无数多个或不定数量的内部函数实现是不现实的,可以用递归来解决。这里实际是参数的复用。
function add() {
let args = Array.prototype.slice.call(arguments);
let inner = function () {
args.push(...arguments)
return inner
}
return inner
}
console.log(add(1)(2)(3)(4));
//以字符串形式返回内部函数,也就是说原本的函数发生了隐式转换,而发生隐式转换是因为调用了内部的toString方法。
- 最后实现把内部函数相加,但是因为内部函数应景返回内部函数,很难返回一个额外的结果到外部。
- return fn,fn是一个函数类型的变量,得到的是函数体源码,而想要得到函数体的源码,就会自动调用toString()方法;如果要打印fn里的内容,只需要重写toString方法。
function add() {
let args = Array.prototype.slice.call(arguments);
let inner = function () {
args.push(...arguments)
return inner
}
inner.toString = function() { //重写toString()
return args.reduce((prev, cur) => {
return prev + cur
})
}
return inner
}
console.log(add(1)(2)(3).toString()); //toString()只有函数返回值参与计算时才会自动调用
这样就“大功告成”啦!
- 再来看看含有柯里化技术的箭头函数
const List = [
{name:'路飞', profession: '一号机'},
{name:'艾斯', profession: '二号机'},
{name:'萨博', profession: '三号机'},
]
const currying = name => el => el[name]
const list_name = currying('name')
console.log(List.map(list_name)); // ['路飞', '艾斯', '萨博']