首頁 web前端 js教程 javascript之典型高階函數應用介紹_javascript技巧

javascript之典型高階函數應用介紹_javascript技巧

May 16, 2016 pm 05:43 PM
高階函數

緣由
雖然以前也使用過javascript語言,但終究是為了配合後端寫的一些零零散散的“代碼段”,更不能說是javascript項目了。很榮幸的是上個月剛到公司剛好碰上專案開始推倒重寫,我們team從頭開始做架構和實現,目的很清楚,為了改進和超越前面的版本。這是個真正意義上的javascript“專案”,當然服務端不是我們team來負責啦。這也是我真正開始全職使用javascript來程式設計。由於之前在學校對形式化方法這門課程比較感興趣,而javascript又是函數式語言,因此我想把更多functional的東西用javascript來表現一下。

幾個函數
這幾個方法都是javascript 1.6 陣列新增的方法。是很典型的functional 函數,當然也很實用。以下是functional的定義並非來自javascript。

filter:接受一個集合Xs(X表示類型,s表示集合),一個謂詞,這個謂詞是從X到bool的映射(函數)。然後過慮這個集合,並傳回謂詞為true的元素所組成的集合。以下是簡單的實作:

複製程式碼 程式碼如下:

function filter(arr,leback ){
var i,out=[];
for(i=0;iif(callback(arr[i]))
out.push (arr[i]);
}
return out;
}

再加一個簡單的檢定:
複製代碼 代碼如下:

var arr = [1,2,3,4,5,6,7,8,9,10];
var even = function(item){
if(typeof item !== "number") return false;
return !(item & 1);
};
var filtered = filter(arr,even);
console.log(filtered);

結果:
2,4,6,8,10
map:接受一個集合Xs,一個函數f,然後把Xs集合中每一個元素按照順序使用f映射,並返回集合f x1, f x2, f x3 ... f xn。實作如下:
複製程式碼 程式碼如下:

function map(arrcallback){ var i,l= arr && arr.length || 0,out = new Array(l);
for(i=0;iout[i]=callback(arr [i]);
return out;
}

測試一下:

複製代碼 程式碼如下:
var arr = [1,2,3,4,5,6,7,8,9,10];
var addTen = function(item) {
return item 10;
};
var mapAdded = map(arr,addTen);
console.log(mapAdded);

結果:
結果:
11,12,13,14,15,16,17,18,19,20
另外還有forEach,every和some三個函數在javascript 1.6中出現。但在使用過程中感覺還是缺少一個強而有力的函數,它就是折疊函數(fold)。正所謂map-reduce,有了map而沒有"reduce"豈不是很掃興?下面就來看看這個」reduce「。

Reduce的實作
上面說的reduce其實也就是折疊函數(fold)。它接受一個Xs集合,一個二元運算子f。然後將f插入到集合中的每兩個相鄰元素之間。舉個例子,fold plus [1,2,3,4] 意即 1 2 3 4。為了更精確,通常需要一個」起始元素「作為f最開始時的第二個參數。例如fold plus [1,2,3,4] 意即(1 (2 (3 (4 0))))。以下是實作:
複製程式碼 程式碼如下:

function fold(arr,callback,b){
var i,x;
if(b) x=b,i= 0;
else x=arr[0],i=1;
for(;ix=callback(arr[i],x);
return x;
}

測試:
複製程式碼


程式碼🎜>
var arr = [1,2,3,4,5,6,7,8,9,10];
var plus = function(a,b){
return a b;
};
var foldPlus = fold(arr,plus,0);
console.log(foldPlus);
結果:
55

這個函數在ECMAScript 5中名字就叫reduce,而函數式裡面通常稱做fold而已,這是很形象的名字。
總結
其實上面在實作這些functional函數的時候寫風格並不是函數式的,因為javascript 語言有具有循環語句。如果沒有循環語句呢?留給下一次探索吧。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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)

如何使用PHP進行函數式編程 如何使用PHP進行函數式編程 Jun 06, 2023 am 08:21 AM

PHP是一種廣泛使用的伺服器端語言,許多Web開發人員喜歡使用PHP的原因之一是它豐富的函數庫和簡單易用的函數語法。而函數式程式設計則是一種程式設計範式,它很好地封裝資料和行為,使得程式碼更加模組化,易於維護和測試。在這篇文章中,我們將介紹如何使用PHP進行函數式程式設計。函數式程式設計基礎函數式程式設計的核心思想是將函數視為一等公民,函數本身可以像變數一樣被傳遞、傳回、組合

如何在Python中創建高階函數? 如何在Python中創建高階函數? Sep 05, 2023 pm 07:29 PM

在Python中,將另一個函數作為參數或將函數作為輸出返回的函數稱為高階函數。讓我們來看看其特性-該函數可以儲存在變數中。該函數可以作為參數傳遞給另一個函數。高階函數可以以列表、雜湊表等形式儲存函數可以從函數中傳回。讓我們來看一些範例−函數作為物件Example的中文翻譯為:範例在這個範例中,這些函數被視為物件。在這裡,函數demo()被賦值給一個變數-#Creatingafunctiondefdemo(mystr):returnmystr.swapcase()#swappingthecase

python高階函數有哪些 python高階函數有哪些 Nov 10, 2023 pm 04:42 PM

高階函數有map()、filter()、reduce()、lambda函數、partial()等。詳細介紹:1、map():這個內建函數接受一個函數和一個或多個可迭代物件作為輸入,然後傳回一個將輸入函數應用於可迭代物件的每個元素的迭代器;2、filter() :這個內建函數接受一個函數和一個可迭代物件作為輸入,然後傳回一個迭代器,該迭代器產生那些使得輸入函數傳回True的元素等等

PHP 箭頭函數:如何處理高階函數的巢狀調用 PHP 箭頭函數:如何處理高階函數的巢狀調用 Sep 13, 2023 am 08:27 AM

PHP箭頭函數:如何處理高階函數的巢狀調用,需要具體程式碼範例引言:在PHP7.4版本中,引入了箭頭函數(arrowfunctions)的概念,箭頭函數是一種簡潔的寫法,能夠優雅地處理高階函數的巢狀呼叫。本文將介紹箭頭函數的基本使用方法,並透過具體程式碼範例示範如何處理高階函數的巢狀呼叫。一、什麼是箭頭函數?箭頭函數是PHP7.4版本引入的新特性,它是一

Python中的高階函數 Python中的高階函數 Sep 13, 2023 pm 06:53 PM

簡介Python的高階函數世界如果您想提高Python程式設計能力並產生更具表現力和更有效的程式碼,那麼您來對地方了。 Python中的函數不僅僅是專門的程式碼區塊。它們也是可以移動、轉移、甚至是動態產生的強大東西。透過處理其他函數,高階函數增強了這種多功能性。本文將廣泛討論高階函數的原理。我們將探索作為一流物件的進程的基礎知識,深入研究高階函數的現實世界範例,並鼓勵lambda函數的功能以實現清晰而美觀的程式碼。也將討論函數式程式設計模型及其在Python中使用時的優點。讀完本文後,您將牢牢掌握高階函數,並且知道

Golang函數的高階函數應用場景分析 Golang函數的高階函數應用場景分析 May 17, 2023 pm 05:40 PM

隨著Golang語言的流行和發展,越來越多的開發者開始嘗試使用函數式程式設計的想法。 Golang中的高階函數為函數式程式設計帶來了很大的便利性,並且在實際開發中應用廣泛。那麼,Golang函數的高階函數應用場景是什麼呢?接下來,我們將對此進行分析。函數參數和傳回值的處理在Golang中,函數可以作為其他函數的參數或傳回函數。這就意味著我們可以將函數作為一個參數傳入另

如何使用PHP進行函數式編程 如何使用PHP進行函數式編程 Jun 06, 2023 am 08:21 AM

PHP是一種廣泛使用的伺服器端語言,許多Web開發人員喜歡使用PHP的原因之一是它豐富的函數庫和簡單易用的函數語法。而函數式程式設計則是一種程式設計範式,它很好地封裝資料和行為,使得程式碼更加模組化,易於維護和測試。在這篇文章中,我們將介紹如何使用PHP進行函數式程式設計。函數式程式設計基礎函數式程式設計的核心思想是將函數視為一等公民,函數本身可以像變數一樣被傳遞、傳回、組合

如何理解 Golang 中函數型別的高階函數? 如何理解 Golang 中函數型別的高階函數? Apr 20, 2024 am 11:54 AM

Golang高階函數可接受和傳回函數。它們分成兩類:接收函數作為參數:處理其他函數或執行動態程式。傳回函數作為傳回值:建立和傳回可儲存和後期執行的函數。

See all articles