咖哩或部分應用是一種功能性技術之一,它聽起來與熟悉傳統寫作JavaScript方式的人們感到困惑。但是,如果適當地應用,它實際上可以使您的功能性JavaScript更具可讀性。
>>
什麼是咖哩?簡而言之,咖哩是構建允許部分應用函數參數的函數的方式。這意味著您可以通過函數期望並獲得結果的所有參數,或者傳遞這些參數的子集,並獲得等待其餘參數的函數。真的很簡單。
咖哩是圍繞功能概念構建的Haskell和Scala等語言中的元素。 JavaScript具有功能功能,但默認情況下並沒有內置咖哩(至少在當前版本中不在語言中)。但是我們已經知道一些功能的技巧,我們也可以在JavaScript中為我們做咖哩。
>讓您了解它的工作方式,讓我們在JavaScript中創建第一個咖哩功能,使用熟悉的語法來構建我們想要的咖哩功能。例如,讓我們想像一個用名字打招呼的功能。我們都知道如何創建一個以名稱和問候的簡單問候功能,並將其名稱登錄到控制台::
var greet = function(greeting, name) { console.log(greeting + ", " + name); }; greet("Hello", "Heidi"); //"Hello, Heidi"此功能需要以參數的方式傳遞名稱和問候,才能正常工作。但是,我們可以使用簡單的嵌套咖哩來重寫此功能,以便基本功能只需要問候,並且它返回了另一個功能,該功能以我們要問候的人的名字命名。
我們的第一個咖哩
var greetCurried = function(greeting) { return function(name) { console.log(greeting + ", " + name); }; };對我們編寫該功能的方式的這種微小調整使我們可以為任何類型的問候創建一個新功能,並將新功能傳遞給我們要問候的人的名稱:
>我們還可以通過在單獨的括號中傳遞每個參數直接調用原始咖哩函數,一個接一個:
var greetHello = greetCurried("Hello"); greetHello("Heidi"); //"Hello, Heidi" greetHello("Eddie"); //"Hello, Eddie"
為什麼不在瀏覽器中嘗試一下?
greetCurried("Hi there")("Howard"); //"Hi there, Howard"咖哩所有東西!
>
>很酷的事情是,現在我們已經學會瞭如何修改傳統功能以使用這種方法來處理論點,我們可以用我們想要的盡可能多的參數來做到這一點:>我們具有與兩個參數相同的靈活性。無論嵌套走了多遠,我們都可以創建新的自定義功能來打招呼,以盡可能多地選擇適合我們的目的的人:
:var greetDeeplyCurried = function(greeting) { return function(separator) { return function(emphasis) { return function(name) { console.log(greeting + separator + name + emphasis); }; }; }; };
更重要的是,我們可以在創建原始咖哩函數的自定義變化時,盡可能多地傳遞參數,創建能夠採用適當數量的其他參數的新功能,每個函數以其自己的括號集分別傳遞:
var greetAwkwardly = greetDeeplyCurried("Hello")("...")("?"); greetAwkwardly("Heidi"); //"Hello...Heidi?" greetAwkwardly("Eddie"); //"Hello...Eddie?"
我們可以輕鬆地定義下屬變化:
var sayHello = greetDeeplyCurried("Hello")(", "); sayHello(".")("Heidi"); //"Hello, Heidi." sayHello(".")("Eddie"); //"Hello, Eddie."咖哩傳統功能
>您可以看到這種方法的功能,特別是如果您需要創建許多非常詳細的自定義功能。唯一的問題是語法。當您構建這些咖哩功能時,您需要保持嵌套返回的功能,並使用需要多組括號的新功能調用它們,每個功能都包含其自己的孤立參數。它可能會變得凌亂。
var askHello = sayHello("?"); askHello("Heidi"); //"Hello, Heidi?" askHello("Eddie"); //"Hello, Eddie?"為了解決這個問題,一種方法是創建一個快速而骯髒的咖哩功能,該功能將命名為沒有所有嵌套返回的現有函數的名稱。咖哩功能將需要刪除該功能的參數列表,並使用這些功能返回原始功能的咖哩版本:
var greet = function(greeting, name) { console.log(greeting + ", " + name); }; greet("Hello", "Heidi"); //"Hello, Heidi"為了使用它,我們將其傳遞給了一個函數的名稱,該函數採用了任何數量的參數,以及我們想要預先填充的盡可能多的參數。我們回來的是一個正在等待其餘參數的函數:
>
var greetCurried = function(greeting) { return function(name) { console.log(greeting + ", " + name); }; };>和以前一樣,我們在從咖哩原始功能中構建衍生功能時要使用的參數數量並不限制:
var greetHello = greetCurried("Hello"); greetHello("Heidi"); //"Hello, Heidi" greetHello("Eddie"); //"Hello, Eddie"認真對待咖哩
> RAMDA等一些功能性JavaScript庫具有更靈活的咖哩功能,可以打破功能所需的參數,並允許您單獨或分組通過它們來創建自定義咖哩變化。如果您想廣泛使用咖哩,這可能是要走的方法。
> 無論您選擇如何在編程中添加咖哩更可讀。函數的每個派生變化都應具有一個名稱,以表明其行為的行為以及其期望的參數。
>參數順序
提前思考論證順序將使計劃更容易計劃咖哩,並將其應用於您的工作。考慮到最可能改變的論點的順序,在設計功能時,無論如何都不是一個壞習慣。
結論
如果您喜歡的話,這篇文章,您可能還喜歡該系列的其他一些:
> return function(b ){
return> return函數(c ){
返回a b c;
}
}
}
}
console.log(add(add(1)(2 )(3)); //輸出:6
>在JavaScript中使用咖哩的局限性或缺點是什麼?主要缺點之一是,對於那些不熟悉該概念的人來說,它可以使代碼更難理解,尤其是在處理大量參數的功能時。由於創建了額外的封閉,它也可能導致性能開銷。此外,它可以使函數調用更多詳細,因為每個參數必須在一組單獨的括號中傳遞。
咖哩與JavaScript中的高階功能有何關係?與JavaScript中高階功能的概念有關。高階函數是一個或多個函數作為參數,返回函數作為其結果或兩者兼而有之的函數。由於咖哩涉及將函數轉換為一系列函數調用,因此它固有地涉及使用高階函數。
>
中與箭頭函數一起使用,是的,可以在JavaScript中與箭頭函數一起使用咖哩。實際上,箭頭函數的語法使它們特別適合咖哩。以下是可以使用箭頭函數編寫上一個添加函數的方式:
const add = a => b => c => a b c;
所有JavaScript函數都可以咖哩嗎? 在理論上,任何JavaScript,任何JavaScript可以使用兩個或多個參數的功能。但是,在實踐中,咖哩功能可能並不總是實用或有益的。例如,咖哩對於需要在不同時間使用不同數量的參數調用的函數可能沒有用。 >咖哩如何影響JavaScript代碼的性能?您的代碼更可讀性和模塊化,也可能對性能產生略有影響。這是因為每次您咖哩功能時,都會創建新的關閉。但是,在大多數情況下,對績效的影響可以忽略不計,並且超過了改進的代碼可讀性和可維護性的好處。
以上是初學者在功能性JavaScript中的咖哩指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!