柯里化函数 -- 期待固定数量参数
//固定参数 function fixedCurryParams(fn) {
var _args = [].slice.call(arguments, 1)
return function () {
var newArgs = _args.concat([].slice.call(arguments, 0))
return fn.apply(this, newArgs)
}
} //期望参数 参数没给够就一直期望 可以累积参数
function curry(fn, length) {
var length = length || fn.length
return function () {
if (arguments.length < length) {
var combined = [fn].concat([].slice.call(arguments, 0))
return curry(fixedCurryParams.apply(this, complay), length - arguments.length)
} else {
return fn.apply(this, arguments)
}
}
}
测试
function add(a, b, c, d) {
return a + b + c + d;
}
var newAdd = fixedCurryParams(add, 1, 2)
var lastAdd = curry(add) console.log(newAdd(1,2,3,4))//10
console.log(newAdd(1, 2)) // 6
var a = lastAdd(1)(2)(3)(5)
console.log(a) //11
应用实例
function ajax(type, url, data) {
var xhr = new XMLHttpRequest()
xhr.open(type, url, true)
xhr.send(data)
}
//通常会这么写
ajax("post", 'www.test.com', 'name=zhangsan')
ajax("post", 'www.test.com', 'name=wnagwu')
ajax("post", 'www.test.com', 'name=lisi')
//使用柯里化后 可以积累参数
var ajaxCurry = curry(ajax)
var post = ajaxCurry('post')
post('www.test.com', 'name='zhangsan')
var postParams = post('www.test.com')
postParams('name=zhangsan')
postParams('name=lisi')
来源:https://www.cnblogs.com/CoderZX/p/11243722.html