天天看點

JS程式設計建議——75:函數柯裡化

建議75:函數柯裡化

柯裡化是把接受多個參數的函數變換成接受一個單一參數的函數,并且傳回一個新函數,這個新函數能夠接受原函數的參數。下面可以通過例子來幫助了解。

function adder(num) {

}

var add5 = adder(5);

var add6 = adder(6);

print(add5(1)); // 6

print(add6(1)); //7

函數adder接受一個參數,并傳回一個函數,這個傳回的函數可以像預期那樣被調用。變量add5儲存着adder(5)傳回的函數,這個函數可以接受一個參數,并傳回參數與5的和。柯裡化在 DOM 的回調中非常有用。

函數柯裡化的主要功能是提供了強大的動态函數建立方法,通過調用另一個函數并為它傳入要柯裡化(currying)的函數和必要的參數而得到。通俗點說就是利用已有的函數,再建立一個動态的函數,該動态函數内部還是通過已有的函數來發生作用,隻是傳入更多的參數來簡化函數的參數方面的調用。

function curry(fn) {

function add(num1, num2) {

var newAdd = curry(add, 5);

alert(newAdd(6)); //11

在curry函數的内部,私有變量args相當于一個存儲器,用來暫時存儲在調用curry函數時所傳遞的參數值,這樣再跟後面動态建立函數調用時的參數合并并執行,就會得到一樣的效果。

函數柯裡化的基本方法和函數綁定是一樣的:使用一個閉包傳回一個函數。兩者的差別在于,當函數被調用時,傳回函數還需要設定一些傳入的參數。

function bind(fn, context) {

建立柯裡化函數的通用方式是:

curry函數的主要功能就是将被傳回的函數的參數進行排序。為了擷取第一個參數後的所有參數,在arguments對象上調用slice()方法,并傳入參數1,表示被傳回的數組的第一個元素應該是第二個參數。

繼續閱讀