javaScript之 柯里化

  1. 前言:我們先要了解下柯里化的概念,什么是柯里化,他可以干什么,好處是什么,要知其然,也要知其所以然。
    • 自夸一句,小哥哥就是這樣的學(xué)習(xí)習(xí)慣 - 喜歡刨根問(wèn)底
  2. 先來(lái)了解下柯里化的概念
    • 扯犢子,你跟我說(shuō)什概念,告訴我怎么用就ok了,sorry,這叫職業(yè)素養(yǎng)。概念必須要清楚。
    • 維基百科對(duì)于柯里化的概念我就不粘貼了,省的邊人說(shuō)我不說(shuō)人話。
    • 在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,柯里化:是一種將使用多個(gè)參數(shù)的一個(gè)函數(shù) 轉(zhuǎn)換成一系列使用一個(gè)參數(shù)的函數(shù)的技術(shù)。
  3. 概念清楚了,老規(guī)矩,分析分析需求。
    • 關(guān)鍵字:多個(gè)參數(shù)的函數(shù),fn(x1,x2,x3...){} 這樣唄
    • 關(guān)鍵字:轉(zhuǎn)換成一系列一個(gè)參數(shù)的函數(shù)
      • var fn1 = curry(add, 1)
      • var fn2 = curry(fn1, 2)
      • var fn3 = curry(fn2, 3)
      • var fn4 = curry(fn3, 4)
      • ....
  4. 開(kāi)擼
    //小哥哥,先的有一個(gè)多個(gè)參數(shù)的函數(shù)
    function add(a,b,c,d){
        return a + b + c + d
    }
    //然后我們?cè)诜庋b一個(gè)柯里化函數(shù)
    function currying(fn){
        let _outArgs = [].slice.call(arguments,1)
        return function(){
            let _innArgs = [].slice.call(arguments,0)
            return fn.apply(null, _outArgs.concat(_innArgs));
        }
    }
    // 轉(zhuǎn)換成一些列一個(gè)函數(shù)的參數(shù)
     var fn1 = currying(add, 1)
     var fn2 = currying(fn1, 2)
     var fn3 = currying(fn2, 3)
     var fn4 = currying(fn3, 4)
     console.log(test4Curry())//10   大功告成,這就是柯里化
    
  5. 小哥哥我不想要上邊的樣子,我想讓他自動(dòng)檢測(cè)參數(shù)夠了自動(dòng)執(zhí)行,好說(shuō)好說(shuō)....。
    • 面試官小哥哥老讓我實(shí)現(xiàn)這樣的功能 currying(1)(2)(3)
    • 這就屬于應(yīng)用柯里化了
     function add(a,b,c,d){
         return a + b + c + d
     }
     function currying(fn){
         let _outArgs = [].slice.call(arguments,1)
         return function(){
             let _innArgs = [].slice.call(arguments,0)
             return fn.apply(null, _outArgs.concat(_innArgs));
         }
     }
     function useCurrying(){
         //拿到真正執(zhí)行函數(shù)需要的參數(shù)的長(zhǎng)度,檢測(cè)到參數(shù)夠了自動(dòng)執(zhí)行
         var length = length || fn.length
             return function(){
                 //參數(shù)不夠,返回一個(gè)函數(shù)
                 if(arguments.length < length){
                     var combined = [fn].concat([].slice.call(arguments,0))
                     return curry(curring.apply(this,combined),length - arguments.length)
                 }else{
                     //參數(shù)夠了給我執(zhí)行,歐力給
                     return fn.apply(this,arguments)
                 }
             }
     }
     let useCurry = useCurrying(add)
     useCurry(1)(2)(3)(4) 
     useCurry(1,2)(3)(4)
     useCurry(1,2,3)(4)
     //..... 都是10  歐力給,沒(méi)毛病。這種寫法是不是很騷,哈哈
    
  6. 小哥哥,上邊這個(gè)柯里化的應(yīng)用太簡(jiǎn)單了,能不能說(shuō)一個(gè)我們項(xiàng)目中經(jīng)常用到的。好多好說(shuō)....
    • 那就來(lái)封裝個(gè)ajax的例子吧。
     function Ajax() {
         //小哥哥,ie下這樣是得不到httpRequest對(duì)象的,ie兼容的問(wèn)題咱就不考慮了
         this.xhr = new XMLHttpRequest();
     }
    
     //有逼格一點(diǎn),原型鏈編程
    
     Ajax.prototype.open = function(type, url, data, callback) {
         this.onload = function() {
             callback(this.xhr.responseText, this.xhr.status, this.xhr);
         }
         this.xhr.open(type, url, data.async);
         this.xhr.send(data.paras);
     }
    
     let methods = "get post" //option,delete...那些方法,按下不表
    
     methods.split(' ').forEach(function(item) {
         Ajax.prototype[item] = currying(Ajax.prototype.open, item);
     });
     // 這樣用起來(lái)是不是很爽....
     var xhr = new Ajax();
     xhr.get('/articles/list.php', {},
     function(data) {
          //自己的業(yè)務(wù)邏輯
     });
     // 在爽一下.....
     var xhr1 = new Ajax();
     xhr1.post('/articles/add.php', {},
     function(data) {
         //自己的業(yè)務(wù)邏輯
     });
    
  7. 進(jìn)入尾聲了,我們總結(jié)下柯里化的好處
    • 前端使用柯理化的用途主要就應(yīng)該是簡(jiǎn)化代碼結(jié)構(gòu),提高系統(tǒng)的維護(hù)性,一個(gè)方法,只有一個(gè)參數(shù),強(qiáng)制了功能的單一性,很自然 就做到了功能內(nèi)聚,降低耦合
    • 柯理化的優(yōu)點(diǎn)就是降低代碼的重復(fù),提高代碼的適應(yīng)性
  8. 后記,柯里化的應(yīng)用場(chǎng)景還有很多很多,記住合適的才是做好的,脫離了業(yè)務(wù)邏輯的技術(shù)都是耍流氓。今天的柯里化就分享到這里
    學(xué)海無(wú)涯,沒(méi)有最強(qiáng),只有更強(qiáng),有錯(cuò)誤的地方希望大家指出,理解不到位的地方,也希望大家指出.....。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容