1. 程式人生 > 實用技巧 >lodash_curry函式柯里化的實現

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

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