柯里化函数 -- 期待固定数量参数
//固定参数 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