柯里化(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種方法 表單提交,以欄位陣列接收 ...
集中問題,一次性出擊
在工作中,總會遇到很多的問題,有些時候有些人會找你處理很多的問題,很多的問題甚至與是由於別人導致的,但是卻需要你來處理,這導致你的工作量非常大.於是你會抱怨,你不想為該使用者處理問題,但是當你將問題提交到領導那裡的時候,領導諮詢到底是什麼問題,領導會忽略掉你的情緒,看事實,你忽然發現你只是記得別人有...