首页 > 其他分享 >【JS】222-JS 函数的 6 个基本术语

【JS】222-JS 函数的 6 个基本术语

时间:2022-10-13 15:31:35浏览次数:56  
标签:术语 const 函数 functions myArray JS console 222 log


英文:Martin Novák 

译文:reahink https://zhuanlan.zhihu.com/p/61868946




【JS】222-JS 函数的 6 个基本术语_数组

让我们谈谈什么是:lambdas(匿名函数)、 first-class functions(头等函数)、higher-order functions(高阶函数)、unary functions(一元函数)、currying(柯里化 )和pure functions(纯函数)。

如果您不清楚命令式和声明式编程之间的区别,可以看我的文章: Imperative versus declarative code… what’s the difference?

什么是Lambdas(匿名)=> 箭头函数?

Lambdas (λ) 在 JavaScript 作为arrow functions(箭头函数)被广为所知:

// this is your regular named function in JavaScriptfunction namedFunction (a, b) {
return a + b;}// this is a lambda, i.e. an arrow functionconst lambda = (a, b) => a + b;

术语lambda是一个正式的数学逻辑系统,起源于lambda演算。Lambda演算是由图灵完成的,它代表了能够构建任何图灵机的通用计算模型。 Lambda expressions(匿名函数表达式) 是函数式编程的基石。如果它对你有所帮助,只需将它视为函数的新缩短语法就行。然而,在对象或类中使用它们时要注意this的指向。

什么是first-class functions(头等函数)?

First-class type 意味着,该类型可以用作变量的值。在JavaScript中一个字符串是头等类型,一个函数也是头等类型。所以函数可以接受其他函数作为参数,并返回函数作为返回值。

在绑定事件监听器时,函数作为first-class被使用:

const handler = () => console.log ('I am function');
document.addEventListener ('click', handler);

什么是higher-order functions(高阶函数)?

高阶函数是一个接受其他函数作为参数或将函数作为返回值返回的函数。 First-order function(一阶函数)是一个函数,它不接受其他函数作为参数,并且不返回函数作为其返回值。

const firstOrder = () => console.log ('First order strikes back!');const higherOrder = whoStrikesBack => whoStrikesBack ();
higherOrder (firstOrder);

什么是unary functions(一元函数)?

该术语涉及一个函数接受一些参数的元数。一元函数(i.e. monadic)是一个只接受一个参数的函数。

const unaryFunction = message => console.log (message);const binaryFunction = (color, message) =>  console.log (`%c${message}`, `color:${color}`);const ternaryFunction = (fnc, color, message) =>  fnc (`%c${message}`, `color:${color}`);

什么是currying(柯里化)?

Currying(柯里化)是一个带有多个参数的函数并将其转换为函数序列的过程,每个函数只有一个参数。

一个有n个参数的函数,可以使用柯里化将它变成一个一元函数。

const binaryFunction = (a, b) => a + b;const curryUnaryFunction = a => b => a + b;curryUnaryFunction (1); // returns a function: b => 1 + bcurryUnaryFunction (1) (2); // returns the number 3

Currying(柯里化)以数学家 Haskell Curry的名字命名,不是吃的。

柯里化函数非常适合提高代码的可重用性和函数式结构。想了解更多,请参考: JavaScript ES6 curry functions with practical examples。它可能会让人习惯,但是我现在写的所有函数都归功于柯里化。

什么是pure functions(纯函数)?

纯函数是一种其返回值仅由其参数决定,没有任何副作用的函数。

这意味着如果你在整个应用程序中的不同的一百个地放调用一个纯函数相同的参数一百次,该函数始终返回相同的值。纯函数不会更改或读取外部状态。

let myArray = [];const impureAddNumber = number => myArray.push (number);const pureAddNumber = number => anArray =>  anArray.concat ([number]);
console.log (impureAddNumber (2)); // returns 1
console.log (myArray); // returns [2]
console.log (pureAddNumber (3) (myArray)); // returns [2, 3]
console.log (myArray); // returns [2]
myArray = pureAddNumber (3) (myArray);
console.log (myArray); // returns [2, 3]

在数组中,Push函数就是不纯的,它会改变它所调用的数组,因此会产生副作用。 push的返回值是一个数字索引。

另外,Concat接受数组并将其与另一个数组连接,从而产生一个没有副作用的全新数组。然后返回两个数组串联后的新数组。

纯函数很重要,因为它们简化了单元测试(没有副作用,也不需要依赖注入),它们避免紧密耦合,并通过消除副作用,使应用程序更加简洁。

我专门撰写了一篇文章来讨论纯函数在编程中的最佳实践:JavaScript Pure Functions for OOP developers

结语

理解函数式编程并不能让你成为更好的开发者,它会让你成为一个更好的人。你可以通过lambda演算用啤酒来招待你的朋友,可以通过有趣的数学逻辑来纠正你的家人。

要在实践中使用所有这些术语,请阅读:8 steps to turn imperative JavaScript class to a functional declarative code

另外,要了解有关条件语句和条件表达式的更多信息,请阅读:How to replace switch and ternaries in functional JavaScript

【JS】222-JS 函数的 6 个基本术语_javascript_02

标签:术语,const,函数,functions,myArray,JS,console,222,log
From: https://blog.51cto.com/u_11887782/5753560

相关文章

  • 45. JS Ajax请求(简明教程)
    1.前言Ajax全称“AsynchronousJavaScriptandXML”,译为“异步JavaScript和XML”,程序员们习惯称之为“阿贾克斯”,它并不是一种技术,而是多种技术的综合体,其中包括Ja......
  • 46. JS类型转换(强制类型转换+隐式类型转换)
    1.前言JavaScript 中有五种基本数据类型(其中包括String、Number、Boolean、Function、Symbol)、三种对象类型(其中包括Object、Date、Array)和两种特殊类型(其中包括Nul......
  • 【JS】80-如何优雅处理前端异常?
    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。一、为什么要处理异常?异常是不可控的,会影响最终的呈现结果,但是我们......
  • 【JS】89-用JavaScript实现的5个常见函数
    前言    在学习 JavaScript,或者前端面试中,有人会问你节流函数、防抖函数、递归函数等,本文分享了5个常见函数,希望对你有所帮助。    在 JavaScript 中有一些问题......
  • js时间戳,获取日期的总毫秒值
    时间戳vardate=newDate();console.log(date.valueOf());//valueof返回对象的原始值,date对象的原始值就是毫秒console.log(date.getTime());//返回一个时间的格林威......
  • 【JS】11-前端HTML5几种存储方式的总结
    接下来要好好总结一些知识,秋招来啦。。。虽然有好多知识都不大会,但是还是要努力一下,运气这种东西,谁知道呢~总体情况h5之前,存储主要是用​​cookies​​​。​​cookies​​......
  • 【JavaScript】13-JS中常见设计模式
    开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。Ja......
  • 【JS】14-精心收集的48个js代码片段分享
    该项目来自于 ​​Github​​​ 用户 ​​Chalarangelo​​​,目前已在 ​​Github​​​ 上获得了 ​​5000​​​ 多Star,精心收集了多达 ​​48​​​ 个有用的 ......
  • WebAssembly01-- 在js中分配内存
    编译选项emccsum.cc-osum.js-sEXPORTED_FUNCTIONS=_malloc,_freesum.cc#include"util.h"#include<stdlib.h>#include<string.h>#include<malloc.h>EM_PORT_AP......
  • js格式化时分秒以'08:08:08’的形式输出
    封装时分秒 functiongetTime(){vartime=newDate();varhour=time.getHours();varminute=time.getMinutes();......