lodash_curry函數柯里化的實現


2020-09-19
lodash_curry函數柯里化的實現
 
拉勾大前端學習中 學到柯里化函數 略微有點懵 自己捋了一下其中的邏輯
下面是實現和思路
function curry(fn) { // 形參是fn應該有的參數 在這里就是getSum中的(a,b,c)3個
  // 此處返回的是函數聲明而非匿名函數 為的是在傳參不足的時候 遞歸調用自己
  return function curriedFn(...args1) { // 實參是調用時候真正傳的參數 有可能是1個 2個或者3個
    console.log(args1);
    // 判斷實參和形參的個數
    if (args1.length < fn.length) { // 如果參數不夠 返回一個匿名函數出去 當這個匿名函數再次調用的時候 
      // 會將再次調用傳的參數和上次調用傳的參數合並后再調用函數聲明 
      return function (...args2) {
        // 由於這里的args1是匿名函數外的數據 形成了一個閉包 所以匿名函數在執行時args1都是獨立的 不會互相影響
        console.log(args1);
        console.log(args2);
        return curriedFn(...args1, ...args2); // 將此次和上次的參數合並再次遞歸 curriedFn 結果作為返回值
        // 如果args1和args2的長度已經>=形參數 顯然再次遞歸的時候 返回值是 fn(合並后的參數) 也就是fn執行結果作為返回值
        // 如果args1和args2的長度還是<形參的長度 就再返回一個匿名函數作為返回值等待更多的參數傳入
      }
    }
    return fn(...args1);
  }
}

function getSum(a, b, c) {
  return a + b + c;
}

let curried = curry(getSum);

b = curried(1); // 執行完curried(1) 打印第4行的 args1 = [1]  返回的是匿名函數 function (...args2) {...}

c = b(2); // 再執行b 也就是function (...args2) {...} 
// 先后打印 10 11行的 args1 = [1] args2 = [2] 然后合並執行curriedFn 打印第三行的args1:[1, 2]
// if 判斷 還不滿足 再將匿名函數當作此次curriedFn的返回值 在第9行 返回給c

let sum1 = c(3); // 執行c時, 打印第10行的 args1 = [1, 2] 打印第11行的 args2 = [3]
// 組合后再調用 curriedFn 打印第4行的args1 = [1,2,3] if判斷已經不滿足
// 執行fn(...[1,2,3])作為此次curriedFn的結果 在第9行ruturn出去 也就是最后的結果 

d = b(5); // 每次執行都是一個閉包 其中的args1 都是互不影響的
let sum2 = d(4);
console.log(sum1); // 6 1+2+3
console.log(sum2); // 10 1+5+4

 

打印結果
 
自己捋一遍 思路清晰多了 如果有錯 望指出~
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM