JavaScript中的curr,也被稱為柯里化(currying),是一種函數(shù)式編程技術(shù)。它可以讓你將一個接收多個參數(shù)的函數(shù)轉(zhuǎn)換成每次只接收一個參數(shù)的函數(shù)序列。這些函數(shù)能夠進(jìn)行柯里化的原因是因為它們都返回一個新函數(shù),新函數(shù)又能繼續(xù)接收一個參數(shù)。
例如,我們有一個簡單的函數(shù),用于對兩個數(shù)字進(jìn)行加法:
function addNumbers(a, b) { return a + b; }
如果我們現(xiàn)在想要使用這個函數(shù)來重復(fù)添加5,這個時候我們可能想要柯里化這個函數(shù),并創(chuàng)建一個新函數(shù)只輸入一個參數(shù):
function addFiveToNumber(currNumber) { return addNumbers(5, currNumber); }
我們現(xiàn)在可以很容易地使用新函數(shù)來添加數(shù)字5到另一個數(shù)字上:
addFiveToNumber(10); // This returns 15
我們也可以將這個新函數(shù)賦值給一個變量,以便隨時都能使用它:
var addFive = addFiveToNumber; addFive(10); // This returns 15
柯里化的最終目的是可以創(chuàng)建一個能夠接受多個參數(shù)的函數(shù),當(dāng)它只接受一個參數(shù)時,會返回另一個只接受一個參數(shù)的函數(shù),每次輸入一個參數(shù)直到達(dá)到期望的參數(shù)數(shù)量并返回結(jié)果。下面的例子是使用柯里化來創(chuàng)建一個接收三個參數(shù)的函數(shù),我們可以在第一次和第二次調(diào)用中只輸入一個參數(shù)。
function foodSelect(chosenFood) { return function secondLevel(foodOption) { return function thirdLevel(drinkOption) { alert("You chose " + chosenFood + ", " + foodOption + ", and " + drinkOption + "."); } } } var burgerSelect = foodSelect("Burger"); var cheeseburgerSelect = burgerSelect("Cheeseburger"); cheeseburgerSelect("Coke"); // This alerts "You chose Burger, Cheeseburger, and Coke."
當(dāng)然,在ES6之后,我們可以使用箭頭函數(shù)更簡潔地實現(xiàn)柯里化。下面的例子展示了如何使用箭頭函數(shù)和柯里化將一個字符串轉(zhuǎn)成小寫并將空格轉(zhuǎn)換為下劃線:
const toLowerCase = str =>str.toLowerCase(); const replaceSpacesWithUnderscores = separator =>str =>str.replace(/ /g, separator); const convertString = replaceSpacesWithUnderscores("_"); const lowerCaseString = convertString(toLowerCase); lowerCaseString("This is a Test String"); // Returns "this_is_a_test_string"
使用柯里化可以幫助我們創(chuàng)造更具可讀性和可復(fù)用性的函數(shù)。它也可以在需要輸入多個變量的時候,讓代碼變得更加整潔、易于維護(hù)。這個技術(shù)不難掌握,只要理解了如何創(chuàng)建一個能夠返回函數(shù)的函數(shù),就可以開始自己的柯里化實踐了。