国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解用場景去理解函數柯里化(入門篇)

2024-05-06 15:40:48
字體:
來源:轉載
供稿:網友

前言

函數柯里化就是將多參簡化為單參數的一種技術方式,其最終支持的是方法的連續調用,每次返回新的函數,在最終符合條件或者使用完所有的傳參時終止函數調用。

場景實例

與其他文章不同,我在本文會重點分享一些柯里化的經典使用場景,讓你在學會這點技巧后能切實的提升代碼的可維護性。

編寫可重用小模塊代碼

比如我們有個方法部分邏輯前置是相同的,后面的執行是因為參數不同導致結果不同的,下面是代碼部分。
計算商品的折扣,我們需要根據不同的折扣以及商品的入參返回其實際的價格。

// 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; }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 栾川县| 红桥区| 涿鹿县| 青海省| 天津市| 伊川县| 政和县| 湘阴县| 三江| 南皮县| 岳阳县| 卢龙县| 星座| 遵义县| 凌云县| 伊金霍洛旗| 满洲里市| 新兴县| 五常市| 景宁| 景德镇市| 甘肃省| 运城市| 金乡县| 莎车县| 丹东市| 乐东| 图片| 遵义县| 铅山县| 建平县| 深泽县| 个旧市| 邓州市| 丰镇市| 商丘市| 沭阳县| 庆云县| 襄城县| 唐山市| 屏边|