函式柯里化

2021-09-20 21:32:27 字數 1995 閱讀 6225

柯里化是一種將使用多個引數的乙個函式轉換成一系列使用乙個引數的函式的技術

第乙個特點 引數復用,本質上是降低通用性,提高適用性。

例子: add(1)(2)(3) ==> 6

利用閉包的原則,add 函式執行的時候,返回 add 函式中的內部函式,再次執行的時候其實執行的是這個內部函式,這個內部函式中接著又巢狀了乙個內部函式,用於計算最終結果並返回。

function

add(a)}}

// 前面兩項固定不變,add(1) add(2)不會再執行 提高效能

const add1 =

add(1)

const add2 =

add1(2

)add(1

)(2)

(3)add2(3

)

第二個特點 提前返回

例子:封裝相容現代瀏覽器和 ie 瀏覽器的事件監聽的方法,正常情況下封裝是這樣的。

var

addevent

=function

(el, type, fn, capture)

, capture)

}else)}

}addevent

(p, click, callback,

true

)addevent

(div, click, callback,

true

)addevent

(span, click, callback,

true

)

該封裝的方法存在的不足是,每次寫監聽事件的時候呼叫 addevent 函式,都會進行 if else 的相容性判斷。事實上在**中只需要執行一次相容性判斷就可以了,後續的事件監聽就不需要再去判斷相容性了。那麼怎麼用函式柯里化優化這個封裝函式?

var

addevent

=function()

, capture);}

}else)}

}}var elbind =

addevent()

// 判斷瀏覽器,得到乙個函式

elbind

(p, click, callback,

true

)elbind

(div, click, callback,

true

)elbind

(span, click, callback,

true

)

js 引擎在執行該段**的時候就會進行相容性判斷,並且返回需要使用的事件監聽封裝函式。

第三個特點 延遲執行

// 空間換時間

varcurryscore

=function

(fn)

else}}

var allscore =

0var curryaddscore =

curryscore

(function()

})curryaddscore(3

)curryaddscore(3

)console.

log(allscore)

// 0

curryaddscore()

console.

log(allscore)

// 6

柯里化通用版:
var

curry

=function

(fn)

else}}

function

add(a, b)

var addcurry =

curry

(add)

addcurry(1

)(2)

()

執行 curry 函式返回的函式接收新的引數與 args 變數儲存的引數合併,並把合併的引數傳入給柯里化了的函式。

參考:

函式柯里化

在電腦科學中,柯里化 currying 是把接受多個引數的函式變換成接受乙個單一引數 最初函式的第乙個引數 的函式,並且返回接受餘下的引數且返回結果的新函式的技術。在直覺上,柯里化聲稱 如果你固定某些引數,你將得到接受餘下引數的乙個函式 柯里化實現的原理 在函式式程式語言中,將函式可以當做物件傳遞呼...

函式柯里化

curry 的概念 只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數先看乙個簡單例子,add函式接受 2 個引數 或者多個 addx函式接受 1 個引數。換而言之,所謂 柯里化 就是把乙個多引數的函式,轉化為單引數函式。將乙個函式轉換為乙個新的函式 非柯里化 function add...

函式柯里化

curry 的概念 只傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數先看乙個簡單例子,add函式接受 2 個引數 或者多個 addx函式接受 1 個引數。換而言之,所謂 柯里化 就是把乙個多引數的函式,轉化為單引數函式。將乙個函式轉換為乙個新的函式 非柯里化 function add...