前言
函數柯里化就是將多參簡化為單參數的一種技術方式,其最終支持的是方法的連續調用,每次返回新的函數,在最終符合條件或者使用完所有的傳參時終止函數調用。
場景實例
與其他文章不同,我在本文會重點分享一些柯里化的經典使用場景,讓你在學會這點技巧后能切實的提升代碼的可維護性。
編寫可重用小模塊代碼
比如我們有個方法部分邏輯前置是相同的,后面的執行是因為參數不同導致結果不同的,下面是代碼部分。
計算商品的折扣,我們需要根據不同的折扣以及商品的入參返回其實際的價格。
// beforefunction getPrice(price,discount){ return price * discount;}let price = getPrice(500,0.1);// after function getPrice(discount){ return price =>{ return price * discount }}// 使用,在這種使用效果下,我們可以固定的肢解拿到百分之十折扣的函數,//也就是針對使用0.1折扣的商品價格都可以簡化這個折扣的傳遞,從而達到簡化參數的目的//那么從函數的運行上來講,也比之前的效率高了,如果解析折扣的過程比較復雜let tenDiscount = getPrice(0.1);let price = tenDiscount(500);let price = getPrice(0.1)(500)看上去有點雞肋,因為我們本來的寫法很簡單,使用了柯里化反而讓簡單的事情變得復雜了,這主要是因為沒有達到我們要把一個函數變成柯里化的經典場景。假如你下面的代碼變成了下面這樣,也許你就能覺察出如果有使用柯里化就會非常方便了,因為針對第一個參數做了若干的處理,甚至可以稱為一個算法或者完整的邏輯判斷流程,那么如果有多個參數調用都涉及這個方法的調用,同一個參數的這部分邏輯是相同可以共用跳過的。codepen連接:鏈接
// complexed fun function getPriceComplex(price,discount){ let actualDiscount = 1; if(discount > 0.8 ) { actualDiscount = 0.8; } else if(discount > 0.5){ actualDiscount = 0.5; } else { actualDiscount = 0.1; } let actualPrice = price - price % 100 ; return actualPrice * actualDiscount;}// complexed fun betterfunction getPriceComplexBetter(discount){ let actualDiscount = 1; if(discount > 0.8 ) { actualDiscount = 0.8; } else if(discount > 0.5){ actualDiscount = 0.5; } else { actualDiscount = 0.1; } return price => { let actualPrice = price - price % 100 ; return actualPrice * actualDiscount; }}console.log(getPriceComplex(500,0.9))let exp1 = getPriceComplexCp(0.9);console.log(exp1);/** price => { let actualPrice = price - price % 100; return actualPrice * actualDiscount;}*/// 相同的輸入參數時 可以緩存下之前代碼邏輯的執行結果 實現模塊的可重用,如果你之前的邏輯是一個純函數console.log(exp1(500))// 400console.log(exp1(400))// 320// get real discount // 當你針對第一個參數的邏輯較為復雜時,出于可維護角度,建議如此 ;// 當你另外一個邏輯也是基于這個返回結果時,出于重用角度,建議如此function getActualDiscount(discount){ let actualDiscount = 1; if(discount > 0.8 ) { actualDiscount = 0.8; } else if(discount > 0.5){ actualDiscount = 0.5; } else { actualDiscount = 0.1; } return actualDiscount;}// complexed fun bestfunction getPriceComplexBest(discount){ let actualDiscount =getActualDiscount(discount); return price => { let actualPrice = price - price % 100 ; return actualPrice * actualDiscount; }}
新聞熱點
疑難解答
圖片精選