搜尋
首頁web前端js教程初學者在功能性JavaScript中的咖哩指南

A Beginner's Guide to Currying in Functional JavaScript

初學者在功能性JavaScript中的咖哩指南

咖哩或部分應用是一種功能性技術之一,它聽起來與熟悉傳統寫作JavaScript方式的人們感到困惑。但是,如果適當地應用,它實際上可以使您的功能性JavaScript更具可讀性。

>

鑰匙要點

  • 咖哩是一種功能編程技術,允許部分應用函數的參數,這意味著您可以通過函數期望的所有參數或一個子集。如果傳遞子集,則返回一個函數,以等待其餘參數。 >
  • 咖哩可以使JavaScript代碼更具可讀性和靈活性。它允許創建一個小型,易於配置的功能的庫,這些功能始終如一,可以迅速使用,並且可以在閱讀代碼時可以理解。
  • > >咖哩時的參數順序很重要。最有可能從一個變體替換為另一種變體的參數應該是傳遞給原始函數的最後一個參數。
  • >一些功能性的JavaScript庫,例如RAMDA,提供了靈活的咖哩功能,可以打破功能所需的參數,並允許您單獨或分組將它們傳遞以創建自定義咖哩變化。如果您打算廣泛使用咖哩,建議使用此類庫。
  • >
  • 更可讀性,更靈活
>吹捧功能性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庫具有更靈活的咖哩功能,可以打破功能所需的參數,並允許您單獨或分組通過它們來創建自定義咖哩變化。如果您想廣泛使用咖哩,這可能是要走的方法。

> 無論您選擇如何在編程中添加咖哩更可讀。函數的每個派生變化都應具有一個名稱,以表明其行為的行為以及其期望的參數。

>參數順序

>咖哩時要牢記的一件事是論點的順序。使用我們描述的方法,您顯然希望您最有可能從一個變體替換為下一個變體,以作為傳遞給原始函數的最後一個參數。

提前思考論證順序將使計劃更容易計劃咖哩,並將其應用於您的工作。考慮到最可能改變的論點的順序,在設計功能時,無論如何都不是一個壞習慣。

結論

咖哩是功能性JavaScript的一種非常有用的技術。它允許您生成一個始終如一,迅速使用的小型,易於配置的功能的庫,並且在閱讀代碼時可以理解。將咖哩添加到您的編碼實踐中將鼓勵在整個代碼中使用部分應用功能,避免大量潛在的重複,並可能幫助您更好地養成命名和處理功能參數的習慣。

>

如果您喜歡的話,這篇文章,您可能還喜歡該系列的其他一些:

>
  • 功能性JavaScript簡介
  • JavaScript中的高階函數
  • >
  • 在功能JavaScript中的遞歸
經常詢問有關在功能JavaScript中咖哩的問題(常見問題解答)

> JavaScript中的咖哩和部分應用之間的主要區別是什麼?但是,它們的實施和使用情況有所不同。咖哩是功能編程中的一個過程,其中具有多個參數的函數被轉換為一個函數序列,每個函數都帶有一個參數。另一方面,部分應用程序是指將許多參數固定到函數的過程,從而產生另一個較小的ARITY函數。咖哩始終產生嵌套的一元(1個動力)功能,而部分應用可以產生任何ARITY的功能。

>

>如何在Javascript中增強代碼可讀性和可維護性? JavaScript中的可讀性和可維護性。通過將復雜的功能分解為更簡單的一單元功能,咖哩使代碼更可讀和易於理解。當每個功能執行一個任務時,它還可以促進清潔劑和更模塊化的代碼。這種模塊化使代碼更易於維護和調試,因為可以將問題隔離到特定功能。

您可以提供JavaScript中咖哩的示例嗎?添加三個數字的函數。如果不咖哩,該函數可能看起來像這樣:

函數add(a,b,c){

>返回a b c; }

console.log(add(1, 2,3) ); //輸出:6

>在咖哩的情況下,相同的函數將寫為:

函數add(a){

return function(b ){
return> return函數(c ){
返回a b c;
}
}
}
}
console.log(add(add(1)(2 )(3)); //輸出:6

>在JavaScript中使用咖哩的局限性或缺點是什麼?主要缺點之一是,對於那些不熟悉該概念的人來說,它可以使代碼更難理解,尤其是在處理大量參數的功能時。由於創建了額外的封閉,它也可能導致性能開銷。此外,它可以使函數調用更多詳細,因為每個參數必須在一組單獨的括號中傳遞。

咖哩與JavaScript中的高階功能有何關係?與JavaScript中高階功能的概念有關。高階函數是一個或多個函數作為參數,返回函數作為其結果或兩者兼而有之的函數。由於咖哩涉及將函數轉換為一系列函數調用,因此它固有地涉及使用高階函數。
>

>可以在JavaScript?

中與箭頭函數一起使用,是的,可以在JavaScript中與箭頭函數一起使用咖哩。實際上,箭頭函數的語法使它們特別適合咖哩。以下是可以使用箭頭函數編寫上一個添加函數的方式:

const add = a => b => c => a b c; console.log(add(add(1)(2) (3)) ); //輸出:6

>是在流行的JavaScript庫或框架中使用的咖哩?例如,這是Ramda和Lodash等庫中的一個基本概念,它為JavaScript中的功能編程提供了實用功能。它也用於Redux,這是一個流行的狀態管理庫,用於REACT。

>在JavaScript中的功能組成方面如何幫助? ​​在JavaScript中的功能組成時,咖哩非常有幫助。功能組成是組合兩個或多個函數以創建新功能的過程。由於咖哩允許您創建單一功能,因此可以通過確保每個函數完全具有一個輸入和一個輸出來簡化函數組成。

>

>

所有JavaScript函數都可以咖哩嗎?

在理論上,任何JavaScript,任何JavaScript可以使用兩個或多個參數的功能。但是,在實踐中,咖哩功能可能並不總是實用或有益的。例如,咖哩對於需要在不同時間使用不同數量的參數調用的函數可能沒有用。

>咖哩如何影響JavaScript代碼的性能?您的代碼更可讀性和模塊化,也可能對性能產生略有影響。這是因為每次您咖哩功能時,都會創建新的關閉。但是,在大多數情況下,對績效的影響可以忽略不計,並且超過了改進的代碼可讀性和可維護性的好處。

以上是初學者在功能性JavaScript中的咖哩指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具