最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年04月11日 12:04:17   作者:RobinsonZhang  
這篇文章主要介紹了用場景去理解函數(shù)柯里化(入門篇),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

場景實例

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

編寫可重用小模塊代碼

比如我們有個方法部分邏輯前置是相同的,后面的執(zhí)行是因為參數(shù)不同導致結果不同的,下面是代碼部分。
計算商品的折扣,我們需要根據(jù)不同的折扣以及商品的入?yún)⒎祷仄鋵嶋H的價格。

// before
function getPrice(price,discount){
	return price * discount;
}

let price = getPrice(500,0.1);


// after 
function getPrice(discount){
	return price =>{
 	return price * discount
 }
}
// 使用,在這種使用效果下,我們可以固定的肢解拿到百分之十折扣的函數(shù),
//也就是針對使用0.1折扣的商品價格都可以簡化這個折扣的傳遞,從而達到簡化參數(shù)的目的
//那么從函數(shù)的運行上來講,也比之前的效率高了,如果解析折扣的過程比較復雜
let tenDiscount = getPrice(0.1);
let price = tenDiscount(500);

let price = getPrice(0.1)(500)


看上去有點雞肋,因為我們本來的寫法很簡單,使用了柯里化反而讓簡單的事情變得復雜了,這主要是因為沒有達到我們要把一個函數(shù)變成柯里化的經(jīng)典場景。假如你下面的代碼變成了下面這樣,也許你就能覺察出如果有使用柯里化就會非常方便了,因為針對第一個參數(shù)做了若干的處理,甚至可以稱為一個算法或者完整的邏輯判斷流程,那么如果有多個參數(shù)調(diào)用都涉及這個方法的調(diào)用,同一個參數(shù)的這部分邏輯是相同可以共用跳過的。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 better
function 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;
}*/
// 相同的輸入?yún)?shù)時 可以緩存下之前代碼邏輯的執(zhí)行結果 實現(xiàn)模塊的可重用,如果你之前的邏輯是一個純函數(shù)
console.log(exp1(500))// 400
console.log(exp1(400))// 320


// get real discount 
// 當你針對第一個參數(shù)的邏輯較為復雜時,出于可維護角度,建議如此 ;
// 當你另外一個邏輯也是基于這個返回結果時,出于重用角度,建議如此
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 best
function getPriceComplexBest(discount){
 let actualDiscount =getActualDiscount(discount);
 return price => {
 	 let actualPrice = price - price % 100 ;
			return actualPrice * actualDiscount;
 }
}

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

簡單改造普通函數(shù)為柯里

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

// 只考慮兩個參數(shù)
function add(a,b){
 return a + b
}

// 但如果你是用柯里化的方式:兩個參數(shù)的時候 ,但這樣對原代碼變動非常大,對于一些復雜的邏輯,這基本不可能
function curryAdd(...args){
 return (...newArgs) => {
 	return anoNumber * number;
 };
}

// 我們寫一個通用的柯里化函數(shù)的方式,經(jīng)過這個函數(shù)的轉換,我們可以將調(diào)用方式簡化
function curry = (fn,...args){
	return (..._args)=>{
 	return fn(...args, ..._arg);
 }
}

let curryAdd = curry(add,10);
let curryAdd2 = curryAdd(11)

不定參數(shù)的累加

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

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

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

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

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

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

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

部分參數(shù)應用

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

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);

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

相關文章

  • js 提取class相同的節(jié)點集合

    js 提取class相同的節(jié)點集合

    可以獲取網(wǎng)頁中相同class的節(jié)點的腳本,然后就可以統(tǒng)一做一些調(diào)整。
    2008-12-12
  • js以分隔符分隔數(shù)組中的元素并轉換為字符串的方法

    js以分隔符分隔數(shù)組中的元素并轉換為字符串的方法

    下面小編就為大家?guī)硪黄猨s以分隔符分隔數(shù)組中的元素并轉換為字符串的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • JS中的.length屬性和.size()方法的區(qū)別

    JS中的.length屬性和.size()方法的區(qū)別

    length是js原生屬性,size()是jQuery方法,如果你只是想獲取元素的個數(shù),兩者效果一樣既.length和.size()獲取的值是一樣的
    2024-08-08
  • JavaScript 獲取 URL 中參數(shù)值的方法

    JavaScript 獲取 URL 中參數(shù)值的方法

    本文將詳細介紹幾種在 JavaScript 中獲取 URL 參數(shù)值的方法,包括現(xiàn)代瀏覽器支持的 URLSearchParams、正則表達式解析以及自定義函數(shù)解析方案,并討論各自的優(yōu)缺點及適用場景,感興趣的朋友一起看看吧
    2025-04-04
  • three.js中文文檔學習之通過模塊導入

    three.js中文文檔學習之通過模塊導入

    這篇文章主要給大家介紹了關于three.js中文文檔學習之通過模塊導入的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或使用three.js具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • 判斷數(shù)組的最佳方法(推薦)

    判斷數(shù)組的最佳方法(推薦)

    下面小編就為大家?guī)硪黄猨s判斷數(shù)組的最佳方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 極品源碼:自動完成 仿163篇

    極品源碼:自動完成 仿163篇

    極品源碼:自動完成 仿163篇...
    2007-07-07
  • Bootstrap每天必學之按鈕(一)

    Bootstrap每天必學之按鈕(一)

    Bootstrap每天必學之按鈕,本文講解的就是大家最為常用的button按鈕的樣式,感興趣的小伙伴們可以參考一下
    2015-11-11
  • javascript順序加載圖片的方法

    javascript順序加載圖片的方法

    這篇文章主要介紹了javascript順序加載圖片的方法,可實現(xiàn)javascript針對圖片的逐次加載,從而減緩服務器壓力,非常具有實用價值,需要的朋友可以參考下
    2015-07-07
  • JavaScript保存并運算頁面中數(shù)字類型變量的寫法

    JavaScript保存并運算頁面中數(shù)字類型變量的寫法

    這篇文章主要介紹了JavaScript保存并運算頁面中數(shù)字類型變量的寫法,當你在頁面中需要不停運算一個數(shù)字變量時非常有用,普通的寫法不能正常運算,使用本文方法就可以,需要的朋友可以參考下
    2015-07-07

最新評論

仁寿县| 阿巴嘎旗| 团风县| 都匀市| 白城市| 芜湖市| 囊谦县| 武义县| 嵊泗县| 新丰县| 景洪市| 浦北县| 大埔区| 建宁县| 怀化市| 弥渡县| 贡觉县| 邹城市| 恩平市| 南陵县| 交口县| 北辰区| 宣恩县| 班戈县| 晋江市| 甘孜县| 讷河市| 安新县| 揭西县| 高尔夫| 雷州市| 南皮县| 南安市| 潜江市| 福建省| 正阳县| 平武县| 乌海市| 华宁县| 咸宁市| 顺平县|