一次性了解柯里化 javascript

2021-09-12 02:19:36 字數 2802 閱讀 1238

柯里化(currying),又稱部分求值(partial evaluation),是把接受多個引數的函式變換成接受乙個單一引數(最初函式的第乙個引數)的函式,並且返回接受餘下的引數而且返回結果的新函式的技術。

柯里化的核心思想是:降低通用性,提高適用性。比如下面的**,由 通用性高 逐漸變為 適用性高

1. 引數復用

假設a,b大多數情況是固定的,只有c每次都變,這樣只需要更改add2()中的引數即可計算a+b+x的值。

如果傳參a,b的函式中需要做大量計算,那麼用柯里化在這裡提高了效能。

(如果a、b總是固定,直接寫死,但這裡不是總是固定的)

function

add(a)}}

//add(1)(2)(3) //6

const add1 =

add(1)

;const add2 =

add1(2

);add2(3

);//6

2. 提前返回

相容現代瀏覽器以及ie瀏覽器的事件新增方法。我們正常情況可能會這樣寫:

var

addevent

=function

(el, type, fn, capture)

, capture);}

else

if(window.attachevent));

}};addevent

(p,click,callback,

true);

addevent

(div,click,callback,

true);

addevent

(span,click,callback,

true

);

這裡存在的問題是,我們只需要判斷一次瀏覽器就可以了,後面兩次的判斷完全沒必要,利用柯里化,修改**如下:

var

addevent

=function()

,(capture));

};}else

if(window.attachevent));

};}}

;var elbindevent =

addevent()

;//這裡執行瀏覽器判斷

elbindevent

(p,click,callback,

true);

//只執行返回的函式

elbindevent

(div,click,callback,

true);

elbindevent

(span,click,callback,

true

);

3. 延遲計算/執行

延遲計算的例子,比如統計分數,

普通寫法:

var allscore =0;

varaddscore

=function

(score)

;addscore(2

);addscore

(6.5);

addscore

(1.5);

console.

log(allscore)

;//10

柯里化:每次的分數放入陣列中,最後一次計算陣列的和,這樣寫的對效能感覺沒啥影響,就是輸入的引數可以是任意個。

var allscore =0;

varcurryscore

=function()

}else}}

;var addscore =

curryscore()

;addscore(2

);addscore

(6.5);

addscore

(1.5,5

);addscore()

;//計算

console.

log(allscore)

;//輸出

三個作用都體現了的版本

var

curry

=function

(fn)

array.prototype.push.

(__array,

.slice.

call

(arguments));

return comm;

//鏈式呼叫,為了體現1:引數復用,實現()()()的效果。}}

;//自定義處理函式:這裡假設是兩個數相加

function

deal

(a,b)

var addscore =

curry

(deal)

;//體現了2:提前返回

addscore(2

)(5)

;//不會計算,只會存

addscore(2

)(5)

();//7 實現3:延遲計算

柯里化與偏函式的區別

柯里化是由n元函式轉化成1元函式

偏函式是由n元函式轉化成n-1元函式

一次性成功

沒有人能隨隨便便成功 最近察覺到自己思維的乙個誤區,希望實現的目標第一次就成功,順順利利跳過失敗。這是大家都想要的結局,美好的期望總被現實的波浪所淹沒,因為失敗是避免不了的。一次性成功的想法導致焦慮,困惑,自我懷疑,這個時候如果放低要求換個角度思考,第一次失敗又如何,如果失敗了倒下了哪有怎樣?只要自...

表單裡同時一次性提交多個

4種方法讓springmvc接收多個物件 標籤 表單提交陣列接收beanlistmolist接收json字串提交 問題背景 我要在乙個表單裡同時一次性提交多名乘客的個人資訊到springmvc,前端html和springmvc controller裡該如何處理?第1種方法 表單提交,以欄位陣列接收 ...

集中問題,一次性出擊

在工作中,總會遇到很多的問題,有些時候有些人會找你處理很多的問題,很多的問題甚至與是由於別人導致的,但是卻需要你來處理,這導致你的工作量非常大.於是你會抱怨,你不想為該使用者處理問題,但是當你將問題提交到領導那裡的時候,領導諮詢到底是什麼問題,領導會忽略掉你的情緒,看事實,你忽然發現你只是記得別人有...