是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
特点1. 返回一个函数
特点2. 将一个带有多个参数的函数转换为一次一个的函数的过程
- 闭包的作用
闭包可以对函数参数进行持久化
function add(a) {
return function(b){
return function(c) {
return a+b+c
}
}
}
let a = add(3)
let ab = a(5)
let abc = ab(2)
console.log(abc) // 10
- 偏函数
function partial(fn) {
// 获取保存函数第一次传入的参数
let args = Array.prototype.slice.call(arguments, 1);
return function() {
//再次调用函数的时候传入的参数
let args1 = Array.prototype.slice.call(arguments);
// 第二次传入的参数和第一次的合并起来
return fn.apply(this, args.concat(args1));
};
}
function add(x, y) {
return x + y
}
let a = partial(add)
console.log(a('hello', ' world')) // hello world
let b = partial(add, 'hello')
console.log(b(' world')) // hello world
- compose 函数
参数为函数名, 函数执行顺序为从右向左,即最右边的函数(最后一个参数)最先执行,执行完的结果作为参数传递给前一个函数(包裹它的函数),一直到整个函数执行完毕,return一个函数
function compose() {
let args = arguments;
let start = args.length - 1;
return function() {
let i = start;
// 执行当前函数,并获取当前函数的结果
let result = args[start].apply(this, arguments);
// 循环开始传入的参数,并把前一次执行的结果传入
while(i--) {
result = args[i].call(this, result);
}
return result;
}
}