JavaScript函數的6個基本術語

2022-01-31 妙味前端

可能你會很熟練,但名稱不一定知道。

今日早讀文章由@reahink翻譯授權分享。

正文從這開始~~

讓我們談談什麼是:lambdas(匿名函數)、 first-class functions(頭等函數)、higher-order functions(高階函數)、unary functions(一元函數)、currying(柯裡化 )和pure functions(純函數)。

如果您不清楚命令式和聲明式編程之間的區別,可以看我的文章: Imperative versus declarative code… what’s the difference?

Lambdas (λ) 在 JavaScript 作為arrow functions(箭頭函數)被廣為所知:

// this is your regular named function in JavaScript
function namedFunction (a, b) {
  return a + b;
}

// this is a lambda, i.e. an arrow function
const 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(柯裡化)是一個帶有多個參數的函數並將其轉換為函數序列的過程,每個函數只有一個參數。

一個有n個參數的函數,可以使用柯裡化將它變成一個一元函數。

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

Currying(柯裡化)以數學家 Haskell Curry的名字命名,不是吃的。

柯裡化函數非常適合提高代碼的可重用性和函數式結構。

想了解更多,請參考: JavaScript ES6 curry functions with practical examples。

它可能會讓人習慣,但是我現在寫的所有函數都歸功於柯裡化。

純函數是一種其返回值僅由其參數決定,沒有任何副作用的函數。

這意味著如果你在整個應用程式中的不同的一百個地放調用一個純函數相同的參數一百次,該函數始終返回相同的值。

純函數不會更改或讀取外部狀態。

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(https://medium.com/front-end-weekly/javascript-pure-functions-for-oop-developers-5fc9020541a8)

理解函數式編程並不能讓你成為更好的開發者,它會讓你成為一個更好的人。

你可以通過lambda演算用啤酒來招待你的朋友,可以通過有趣的數學邏輯來糾正你的家人。

譯者:@reahink
譯文:https://zhuanlan.zhihu.com/p/61868946
作者:@Martin Novák
原文:https://medium.com/front-end-weekly/6-fundamental-terms-in-functional-javascript-e25d50d40b2c

更多優質前端教程盡在妙味課堂:

https://study.miaov.com/study

相關焦點

  • 走近 (javascript, 函數式)
    採用純函數組合成的函數式編程方法,致力於減少或消除類似這樣可能的錯誤:var arr = [1,2,3,4,5];console,log(arr.map((num => num*2)); //[2,4,6,8,10]console,log(arr.map((num => num*2)); //[2,4,6,8,10
  • JavaScript 函數replace揭秘
    在JavaScript中replace函數作為字符串替換函數,它是一個具有強大威力的字符串操作函數,對於常見字符串操作的推薦用法。下面來幾個demo:"boy & girl".replace(/(\w+)\s*&\s*(\w+)/g,"$2 & $1") //girl & boy"boy".replace(/\w+/g,"$&-$&") // boy-boy"javascript".replace(/script/,"$& !
  • JavaScript函數 - 事件驅動
    什麼是事件驅動函數? 最後給大家補充一個知識,叫做事件驅動函數,它到底是做什麼的呢?在頁面交互的過程中所調用的函數,該函數被稱之為事件驅動函數。現在先來簡單的了解一下,以後會詳細講到什麼是事件?和頁面交互的行為稱之為事件比如:滑鼠點擊某個按鈕時(onclick)、滑鼠浮動,或者滑鼠離開某一個區域(onmouseover、onmouseout)、文本框獲取焦點和失去焦點時(onfocus、onblur)等等如果我們想給一個按鈕綁定一個事件,就要通過事件驅動函數來綁定,並且通過id來找到它<script type = "text/javascript
  • Javascript匿名函數
    它們之所以被稱為匿名函數是因為不同於普通函數,它們並沒有函數名。匿名函數是通過函數表達式而不是函數聲明語法定義的。你可以在任何可以放置表達式的地方利用函數表達式創建一個新函數。例如你可以定義一個新函數,作為一個函數調用的參數或者作為另一個對象的屬性。
  • JavaScript 數組操作函數總結
    不過不會針對每個辦法都進行一下總結,只是針對一些比較常用的做個備註一下。這裡總結到的 js 數組操作函數有:push,pop,join,shift,unshift,slice,splice,concat(1)push 和 pop這兩個函數都是對數組從尾部進行壓入或彈出操作。
  • 深入理解 JavaScript 回調函數
    你只需定義一次函數,然後在需要時去調用它,而不必一次又一次地編寫相同的代碼。聲明一個函數現在,讓我們看看如何在 javascript 中聲明一個函數。使用函數的構造函數: 在這種方法中,函數是在「函數」的構造函數的幫助下創建的。
  • 【JavaScript】Promise函數的用法
    javascript
  • 第一篇:JavaScript基本語法
    JavaScript基本語法JavaScript語法與Java語法類似,但JavaScript的語法規則要比Java語言的語法規則簡單的多。JS代碼塊一般在函數、條件結構、循環結構內部使用。>其中,function是聲明JS函數的關鍵字,verify是函數名稱,函數主體使用一對大括號「{}」括起來,由大括號括起來的是Js代碼塊。
  • javascript常用函數推薦
    繼續上一篇的內容,本文繼續javascript數組相關的常用函數推薦,基於ES6+規範,上一篇請查看這裡countOccurrences計算數組中值的出現次數。每次遇到數組內的特定值時,使用Array.prototype.reduce()遞增計數器。
  • [翻譯]淺談JavaScript中的高階函數
    原文Understanding High-Order Functions in JavaScript - (https://blog.bitsrc.io/understanding-higher-order-functions-in-javascript-75461803bad)
  • JavaScript函數 - 遞歸
    什麼是函數遞歸?遞歸是指函數自己調用自己。注意:我們可以寫出遞歸,但是我們並不知道她如何得出結果。1.面試官如果問你遞歸的相關知識,面試官的水平還不錯。2.但是在工作中,一般情況下禁止使用遞歸。2.找這一次和上一次的關係3.假設當前的函數已經可以使用,調用自身計算上一次的運行結果,再寫出這次的運行結果特點:1.必須有參數2.必須由return返回值舉個小例子:計算1加到n的和分析:先來封裝一個函數為sun(n); 找出臨界值,如果n==1時,就直接return返回1
  • 6 個JavaScript 中Map() 的用例
    英文 | https://betterprogramming.pub/6-
  • 七天學會javascript第一天javascript介紹
    前幾周寫了幾篇關於入門php的文章,反響還不錯,之前簡單的提到了JavaScript,這周小編重點介紹JavaScript讓大家可以在一周時間內掌握這門前端語言的基本用法。javascript介紹javascript數據類型javascript運算符javascript對象javascript
  • 深入理解 JavaScript 中的函數
    本文旨在提供web開發人員必須了解的所有JavaScript函數的基本知識。
  • 浪漫javascript程式設計師:用浪漫的方式教你模仿函數重載
    浪漫javascript程式設計師:用浪漫的方式教你模仿函數重載。浪漫是一種生活儀式,不分年齡,不分職業,不分地位。現在,且看程式設計師的浪漫模式。在javascript語言中,函數是沒有重載功能的。也就是說,在javascript函數中,無法通過識別參數的個數及數據類型調用有不同功能的同名函數。但是,程式設計師可以藉助javascript函數中的arguments對象的特性,模仿實現函數的重載,在一定程度上彌補了該程式語言中函數功能的不足。
  • JavaScript日期函數 - 計時器、innerHTML
    (或匿名函數),毫秒數 ); 或者setInterval( function(){ } , 毫秒數 ); 只不過一個是寫了函數名,一個是直接定義了函數功能:每隔所傳參數的毫秒數,就調用一次所傳參數的函數返回值:當前頁面上對於這個定時器的唯一標識,定時器的ID有了定時器的ID我們就可以取消定時器,下面會講到舉個小例子:
  • 【JavaScript】箭頭函數
    箭頭函數箭頭函數是在es6中引入的,用法十分簡單,允許使用 => 定義函數// 箭頭函數const fn = (
  • 14個 JavaScript 代碼優化技巧
    用外行術語來說,垃圾收集就是收集並釋放已分配給對象,但目前尚未在程序的任何部分中使用的內存。在 C 這樣的程式語言中,開發人員必須使用 malloc() 和 dealloc() 函數來處理內存分配和釋放操作。雖然在 JavaScript 中垃圾回收是自動執行的,但在某些情況下它也不是完美的。
  • JavaScript alert()函數用法說明
    JavaScript alert()函數用法說明 你對JavaScript alert()函數的用法是否熟悉,這裡和大家分享一下,alert消息對話框通常用於一些對用戶的提示信息,例如在表單中輸入了錯誤的數據時。
  • WEB開發者必備的7個JavaScript函數
    我記得數年前,只要我們編寫JavaScript,都必須用到幾個常用的函數,比如,addEventListener 和 attachEvent