柯里化的概念
所谓的柯里化就是具有较多参数的函数转换成具有较少参数的函数的过程
例如 :获取随意四个数的和
//这是我们平常的写法
function getSum(a, b, c, d) {
return a + b + c + d
}
console.log(getSum(1, 2, 3, 4)); //10
//经过柯里化函数后就可这样写
function getSum(a, b, c, d) {
return a + b + c + d
}
//柯里化功能函数
function curry(fn) {
//...
}
//此时会返回一个新的函数,newGS就是经过柯里化处理过的新的函数
let newGS = curry(getSum)
//如果你的函数参数传递完成,会直接执行,没有传递完成,会继续返回一个函数期待下次调用函数是把参数传递完成,知道传完为止
console.log(newGS(1, 2)(3, 4));
console.log(newGS(1, 2)(3)(4));
console.log(newGS(1)(2)(3)(4));
获取随意四个数的和(经过柯里化处理)
function getSum(a, b, c, d) {
return a + b + c + d
}
//柯里化函数
function curry(fn, args) { //args不是每次传递进来的都是空数组 所以要传个形参
let length = fn.length //获取函数fn传递参数的总长度
args = args || [] //给个空数组存放传递进来的数值
return function (...test) {
let _args = [...args, ...test] //把所有的数值放入到这个数组中
if (_args.length < length) { //当传递数值的长度小于总长度是,会继续返回此函数
return curry.call(this, fn, _args) //此时this指向curry call要改变this指向 并指向fn
} else {
return fn.apply(this, _args) //长度相等就返回和
}
}
}
let newGS = curry(getSum)
console.log(newGS(1, 2, 3, 4)); //10
console.log(newGS(1, 2)(3, 4)); //10
console.log(newGS(1, 2)(3)(4)); //10
console.log(newGS(1)(2)(3)(4)); //10
日常会用到的柯里化函数(ajax)
//ajax也会用到柯里化
function ajax(method,url,data){
var xhr = new XMLHttpRequest
xhr.open(method,url,true)
xhr.send(data)
}
//原生写法
//ajax('GET','www.baidu.com','{}')
//柯里化函数后写法
let ajax_get = curry(ajax)
ajax_get('GET')('www.baidu.com')(null)