目录
钥匙要点
>咖喱时要牢记的一件事是论点的顺序。使用我们描述的方法,您显然希望您最有可能从一个变体替换为下一个变体,以作为传递给原始函数的最后一个参数。
咖喱是功能性JavaScript的一种非常有用的技术。它允许您生成一个始终如一,迅速使用的小型,易于配置的功能的库,并且在阅读代码时可以理解。将咖喱添加到您的编码实践中将鼓励在整个代码中使用部分应用功能,避免大量潜在的重复,并可能帮助您更好地养成命名和处理功能参数的习惯。
> JavaScript中的咖喱和部分应用之间的主要区别是什么?但是,它们的实施和使用情况有所不同。咖喱是功能编程中的一个过程,其中具有多个参数的函数被转换为一个函数序列,每个函数都带有一个参数。另一方面,部分应用程序是指将许多参数固定到函数的过程,从而产生另一个较小的ARITY函数。咖喱始终产生嵌套的一元(1个动力)功能,而部分应用可以产生任何ARITY的功能。
>可以在JavaScript?
>
首页 web前端 js教程 初学者在功能性JavaScript中的咖喱指南

初学者在功能性JavaScript中的咖喱指南

Feb 19, 2025 am 11:45 AM

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

热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

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

Zustand异步操作:如何确保useStore获取的最新状态? Zustand异步操作:如何确保useStore获取的最新状态? Apr 04, 2025 pm 02:09 PM

zustand异步操作中的数据更新问题在使用zustand状态管理库时,经常会遇到异步操作导致数据更新不及时的问题。�...

See all articles