亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

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

2024-05-06 16:49:50
字體:
來源:轉載
供稿:網友

前言

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

場景實例

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

編寫可重用小模塊代碼

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

// 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; }}

總結,無論如何,我們使用某種技巧或者封裝或者其他,都是為了讓代碼更可用,原先復雜不可測試、不可理解的代碼變得更有調理,更節省性能的角度出發的,當你的思維方式中有這種的時候,你就不會覺得是為了形式而使用,而是你的編碼習慣或者風格就是如此。

簡單改造普通函數為柯里

假如我們需要把一個原來非柯里的函數如何快速改造,在不影響原來主要代碼邏輯的情況下,想下我們代碼可能如何寫?

// 只考慮兩個參數function add(a,b){ return a + b}// 但如果你是用柯里化的方式:兩個參數的時候 ,但這樣對原代碼變動非常大,對于一些復雜的邏輯,這基本不可能function curryAdd(...args){ return (...newArgs) => { 	return anoNumber * number; };}// 我們寫一個通用的柯里化函數的方式,經過這個函數的轉換,我們可以將調用方式簡化function curry = (fn,...args){	return (..._args)=>{ 	return fn(...args, ..._arg); }}let curryAdd = curry(add,10);let curryAdd2 = curryAdd(11)

不定參數的累加

一個比較經典的練手題,把下面的代碼用柯里化的方式實現,其難點簡單分析如下:如果你沒有了解過柯里化,可能覺得基本無法完成。

1 動態入參個數,這個也許還可以通過arguments循環完成2 每次都能接受新的參數繼續累加,這必須是返回新函數并帶有之前的結果,要求是具有柯里化特點3 每次不在追加參數時,需要能得到的值,這個需要你了解toString方法來改變結果值

實現一個add方法,使計算結果能夠滿足如下預期: add(1)(2)(3) = 6

add(1, 2, 3)(4) = 10

add(1)(2)(3)(4)(5) = 15

function add() { // 第一次執行時,定義一個數組專門用來存儲所有的參數 var _args = [].slice.call(arguments); // 在內部聲明一個函數,利用閉包的特性保存_args并收集所有的參數值,執行時已經收集所有參數為數組 var adder = function () {  var _adder = function() {   // 執行收集動作,每次傳入的參數都累加到原參數   [].push.apply(_args, [].slice.call(arguments));   return _adder;  };  // 利用隱式轉換的特性,當最后執行時隱式轉換,并計算最終的值返回  _adder.toString = function () {   return _args.reduce(function (a, b) {    return a + b;   });  }  return _adder; } return adder(_args);}

備注:codepen中的console.log方法被重寫,會有報錯的問題,你可以直接通過瀏覽器的console控制臺調試這個方法。

部分參數應用

部分參數應用是指有些場景是希望固定傳遞多個參數,來得到其固定的函數,然后基于這個函數去執行代碼。類似于第一個例子中的一個折扣參數得出折扣算法的使用。我們將第一個例子再復雜化一些。就會變成這樣的。

function getActualDiscount(custoemrLevel,discount){	}function getPriceComplex (custoemrLevel,discount){	let actualDiscount = getActualDiscount(custoemrLevel,discount); return price=>{ 	return price * actualDiscount; }}// 等級一的折扣策略 let strategyLev1WithOnepoint = getPriceComplex('lev1',0.1) ;let actualPrice = strategyLev1WithOnepoint(500);

以上所述是小編給大家介紹的用場景去理解函數柯里化(入門篇)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线| 亚洲国产精品va在线看黑人| 久久激情视频免费观看| 91在线精品播放| 午夜精品一区二区三区在线播放| 精品亚洲精品福利线在观看| 揄拍成人国产精品视频| 青青精品视频播放| 国产精品av免费在线观看| 亚洲在线免费观看| 亚洲国产精品va| 日本久久91av| 日韩在线视频二区| 亚洲老司机av| 91久久精品国产91久久性色| 爽爽爽爽爽爽爽成人免费观看| 黑丝美女久久久| 97久久超碰福利国产精品…| 尤物九九久久国产精品的特点| 亚洲综合在线小说| 亚洲已满18点击进入在线看片| 亚洲精品永久免费精品| 中文字幕亚洲字幕| 欧美国产精品人人做人人爱| zzjj国产精品一区二区| 国产精品美女在线观看| 日韩中文第一页| 国产精品成人免费电影| 欧美激情a∨在线视频播放| 国产精品黄色av| 久久亚洲精品毛片| 国产一区二区三区直播精品电影| 亚洲人成电影网站色www| 欧美激情免费视频| 久久久精品中文字幕| 亚洲va久久久噜噜噜久久天堂| 91精品国产成人| 欧美激情一级欧美精品| 亚洲伊人久久综合| 中文字幕日本精品| 成人做爰www免费看视频网站| 日韩精品中文字幕在线播放| 亚洲永久在线观看| 成人www视频在线观看| 国产精品久久久久久久av电影| 欧美床上激情在线观看| 精品国产乱码久久久久久婷婷| 日本精品一区二区三区在线| 57pao精品| 欧美中文字幕第一页| 国产一区视频在线播放| 欧美夫妻性生活视频| 日韩女优人人人人射在线视频| 成人黄色av网站| 精品国产乱码久久久久久天美| 91精品久久久久| 亚洲视频免费一区| 亚洲黄页视频免费观看| 综合欧美国产视频二区| 成人激情视频在线播放| 亚洲精品久久久久久久久| 欧洲成人在线观看| 最近2019免费中文字幕视频三| 久久婷婷国产麻豆91天堂| 中文字幕久久精品| 精品亚洲国产视频| 国产亚洲人成a一在线v站| 久久精品国产清自在天天线| 日韩在线精品视频| 午夜欧美大片免费观看| 日韩电影在线观看中文字幕| 亚洲精品久久久久中文字幕二区| 国产精品久久久久久超碰| 国产精品视频自在线| 国内偷自视频区视频综合| 亚洲美女精品成人在线视频| 亚洲国产另类 国产精品国产免费| 亚洲欧美另类在线观看| 久久全国免费视频| 欧美成人午夜免费视在线看片| 色99之美女主播在线视频| 成人激情免费在线| 久久精品国产成人精品| 国产在线精品播放| 精品国产精品三级精品av网址| 国内精品久久久久| 欧美在线不卡区| 成人久久精品视频| 欧美成人午夜免费视在线看片| 久久久精品免费视频| 91久久在线观看| 欧美日韩在线视频一区| 最近2019中文字幕mv免费看| 欧美激情a在线| 亚洲乱码av中文一区二区| 影音先锋日韩有码| 久久手机免费视频| 欧美日韩视频免费播放| 亚洲电影在线观看| 欧美成人一区在线| 国产精品扒开腿做爽爽爽视频| 亚洲999一在线观看www| 国产一区二区三区欧美| 成人高清视频观看www| 98精品在线视频| 欧美精品一区在线播放| 97精品免费视频| 成人精品福利视频| 美日韩丰满少妇在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美日韩免费一区| 亚洲黄色免费三级| 中文字幕日本欧美| 久久久视频免费观看| 午夜伦理精品一区| 日韩动漫免费观看电视剧高清| 亚洲欧洲一区二区三区久久| 亚洲欧美国产va在线影院| www.亚洲一区| 久久青草精品视频免费观看| 国产精品影院在线观看| 精品国产依人香蕉在线精品| 国产精品丝袜视频| 中文综合在线观看| 亚洲精品国产精品乱码不99按摩| 国产精品久久久久久久久免费| 国产成人免费av电影| 亚洲最大福利视频| 亚洲日韩欧美视频一区| 久久久在线免费观看| 欧美丰满片xxx777| 日本乱人伦a精品| 国产成人精品日本亚洲专区61| 亚洲a级在线播放观看| 欧美最顶级的aⅴ艳星| 91精品国产综合久久香蕉922| 欧美色视频日本高清在线观看| 国产在线拍偷自揄拍精品| 亚洲欧美日韩一区在线| 最近中文字幕mv在线一区二区三区四区| 国产一区视频在线| 亚洲xxxx视频| 亚洲成avwww人| 久久久影视精品| 日韩在线视频免费观看| 亚洲国产欧美一区二区三区久久| 亚洲人成免费电影| 欧美日韩性生活视频| 国产精品主播视频| 欧美亚洲伦理www| 欧美在线观看网站| 国产欧美精品在线播放| 亚洲四色影视在线观看| 欧美大肥婆大肥bbbbb| 欧美高清一级大片| 国产精品户外野外| 欧美日韩免费看| 日韩av电影在线播放| 久久久精品网站| 国产一区二区三区视频在线观看| 色综合天天综合网国产成人网| 国产精品99久久久久久久久久久久| 国产精品亚洲美女av网站| 午夜精品一区二区三区av|