柯里化函数

对着背影说爱祢 提交于 2020-02-09 03:58:32

柯里化函数 -- 期待固定数量参数

//固定参数     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')

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!