整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          javascript的5種常見函數的寫法和調用方式,收藏起來

          函數在開發中隨處可見,經常在開發中我們聲明函數就使用了一兩種就已經足夠了,但是,對我這有夢想的碼農來說,這顯然是不夠的,因此,總結整理了5中常見的聲明方式和調用方式。

          1、函數聲明(最常規寫法)

          2、函數表達式(匿名函數寫法)

          3、將方法作為一個對象

          4、構造函數中給對象添加方法 (利用原型特性實現)

          5、自執行函數

          1. 最前最后加括號
          1. function外面加括號

          這種做法比方法1少了一個代碼整體性的好處。

          1. function前面加運算符,常見的是!與void。

          喜歡小編文章的可以點個贊關注小編哦,小編每天都會給大家更新文章。

          我自己是一名從事了多年的前端老程序員,小編為大家準備了新出的前端編程學習資料,免費分享給大家!

          如果你也想學習前端,那么幫忙轉發一下然后再關注小編后私信【1】可以得到我整理的這些前端資料了(私信方法:點擊我頭像進我主頁有個上面有個私信按鈕)

          者:前端工匠

          公號 / 浪里行舟

          前言

          函數式編程在前端已經成為了一個非常熱門的話題。在最近幾年里,我們看到非常多的應用程序代碼庫里大量使用著函數式編程思想。

          本文將略去那些晦澀難懂的概念介紹,重點展示在 JavaScript 中到底什么是函數式的代碼、聲明式與命令式代碼的區別、以及常見的函數式模型都有哪些?

          一、什么是函數式編程

          函數式編程是一種編程范式,主要是利用函數把運算過程封裝起來,通過組合各種函數來計算結果。函數式編程意味著你可以在更短的時間內編寫具有更少錯誤的代碼。舉個簡單的例子,假設我們要把字符串 functional programmingisgreat 變成每個單詞首字母大寫,我們可以這樣實現:

          上面的例子先用 split 把字符串轉換數組,然后再通過 map 把各元素的首字母轉換成大寫,最后通過 join 把數組轉換成字符串。整個過程就是 join(map(split(str))),體現了函數式編程的核心思想:通過函數對數據進行轉換。

          由此我們可以得到,函數式編程有兩個基本特點:

          • 通過函數來對數據進行轉換
          • 通過串聯多個函數來求結果

          二、對比聲明式與命令式

          • 命令式:我們通過編寫一條又一條指令去讓計算機執行一些動作,這其中一般都會涉及到很多繁雜的細節。命令式代碼中頻繁使用語句,來完成某個行為。比如 for、if、switch、throw 等這些語句。
          • 聲明式:我們通過寫表達式的方式來聲明我們想干什么,而不是通過一步一步的指示。表達式通常是某些函數調用的復合、一些值和操作符,用來計算出結果值。

          從上面的例子中,我們可以看到聲明式的寫法是一個表達式,無需關心如何進行計數器迭代,返回的數組如何收集,它指明的是做什么,而不是怎么做。函數式編程的一個明顯的好處就是這種聲明式的代碼,對于無副作用的純函數,我們完全可以不考慮函數內部是如何實現的,專注于編寫業務代碼。

          三、常見特性

          無副作用

          指調用函數時不會修改外部狀態,即一個函數調用 n 次后依然返回同樣的結果。

          透明引用

          指一個函數只會用到傳遞給它的變量以及自己內部創建的變量,不會使用到其他變量。

          不可變變量

          指的是一個變量一旦創建后,就不能再進行修改,任何修改都會生成一個新的變量。使用不可變變量最大的好處是線程安全。多個線程可以同時訪問同一個不可變變量,讓并行變得更容易實現。由于 JavaScript 原生不支持不可變變量,需要通過第三方庫來實現。(如 Immutable.js,Mori 等等)

          函數是一等公民

          我們常說函數是JavaScript的"第一等公民",指的是函數與其他數據類型一樣,處于平等地位,可以賦值給其他變量,也可以作為參數,傳入另一個函數,或者作為別的函數的返回值。下文將要介紹的閉包、高階函數、函數柯里化和函數組合都是圍繞這一特性的應用

          四、常見的函數式編程模型

          1.閉包(Closure)

          如果一個函數引用了自由變量,那么該函數就是一個閉包。何謂自由變量?自由變量是指不屬于該函數作用域的變量(所有全局變量都是自由變量,嚴格來說引用了全局變量的函數都是閉包,但這種閉包并沒有什么用,通常情況下我們說的閉包是指函數內部的函數)。

          閉包的形成條件:

          • 存在內、外兩層函數
          • 內層函數對外層函數的局部變量進行了引用

          閉包的用途:可以定義一些作用域局限的持久化變量,這些變量可以用來做緩存或者計算的中間量等。

          上面例子是一個簡單的緩存工具的實現,匿名函數創造了一個閉包,使得 store 對象 ,一直可以被引用,不會被回收。

          閉包的弊端:持久化變量不會被正常釋放,持續占用內存空間,很容易造成內存浪費,所以一般需要一些額外手動的清理機制。

          2.高階函數

          函數式編程傾向于復用一組通用的函數功能來處理數據,它通過使用高階函數來實現。高階函數指的是一個函數以函數為參數,或以函數為返回值,或者既以函數為參數又以函數為返回值

          高階函數經常用于:

          • 抽象或隔離行為、作用,異步控制流程作為回調函數,promises,monads等
          • 創建可以泛用于各種數據類型的功能
          • 部分應用于函數參數(偏函數應用)或創建一個柯里化的函數,用于復用或函數復合。
          • 接受一個函數列表并返回一些由這個列表中的函數組成的復合函數。

          JavaScript 語言是原生支持高階函數的, 例如Array.prototype.map,Array.prototype.filter 和 Array.prototype.reduce 是JavaScript中內置的一些高階函數,使用高階函數會讓我們的代碼更清晰簡潔。

          map

          map() 方法創建一個新數組,其結果是該數組中的每個元素都調用一個提供的函數后返回的結果。map 不會改變原數組。

          假設我們有一個包含名稱和種類屬性的對象數組,我們想要這個數組中所有名稱屬性放在一個新數組中,如何實現呢?

          filter

          filter() 方法會創建一個新數組,其中包含所有通過回調函數測試的元素。filter 為數組中的每個元素調用一次 callback 函數, callback 函數返回 true 表示該元素通過測試,保留該元素,false 則不保留。filter 不會改變原數組,它返回過濾后的新數組。

          假設我們有一個包含名稱和種類屬性的對象數組。我們想要創建一個只包含狗(species: "dog")的數組。如何實現呢?

          reduce

          reduce 方法對調用數組的每個元素執行回調函數,最后生成一個單一的值并返回。reduce 方法接受兩個參數:1)reducer 函數(回調),2)一個可選的 initialValue。

          假設我們要對一個數組的求和:

          3.函數柯里化

          柯里化又稱部分求值,柯里化函數會接收一些參數,然后不會立即求值,而是繼續返回一個新函數,將傳入的參數通過閉包的形式保存,等到被真正求值的時候,再一次性把所有傳入的參數進行求值。

          這里我們定義了一個 add 函數,它接受一個參數并返回一個新的函數。調用 add 之后,返回的函數就通過閉包的方式記住了 add 的第一個參數。那么,我們如何來實現一個簡易的柯里化函數呢?

          由此我們可以看出,柯里化是一種“預加載”函數的方法,通過傳遞較少的參數,得到一個已經記住了這些參數的新函數,某種意義上講,這是一種對參數的“緩存”,是一種非常高效的編寫函數的方法!

          4.函數組合 (Composition)

          前面提到過,函數式編程的一個特點是通過串聯函數來求值。然而,隨著串聯函數數量的增多,代碼的可讀性就會不斷下降。函數組合就是用來解決這個問題的方法。假設有一個 compose 函數,它可以接受多個函數作為參數,然后返回一個新的函數。當我們為這個新函數傳遞參數時,該參數就會「流」過其中的函數,最后返回結果。

          .對比Java中的方法:

          2.Javascript中函數的語法格式(函數語法格式(注意:形式參數只寫名字,不寫var)):

          3.函數必須調用才可以執行:

          3.1調用方法1(函數名(參數)):

          3.2調用方法2(使用事件句柄):

          注意:window.alert()和我們自己寫的函數沒什么區別,只不過一個是他們js自己內定的一個是我們自己寫的。

          4.在js中函數不可重名:

          4.1Javascript定義同名函數,后面聲名的函數會將前面聲名的函數覆蓋,即后面的函數做主

          或者說:兩個同名函數出現,他會認為這兩個函數一樣,直接將第一個函數從內存中抹除。

          4.2例子(同名函數調用,只調用了第二個函數):

          --------------------------------------------

          5.關于定義方法傳入參數(定義的方法有兩個形參,調用時分別傳入兩個數值;一個字符串;空值;三個數值):

          函數代碼:

          ----------------------------------------------

          分別傳入兩個數值;一個字符串;空值(//后面的為運行結果)

          --------------------------------------------

          傳入三個數值:

          注意:定義兩個變量,調用方法傳入三個參數,則第三個參數會廢了,之所以為三,是因為1+2為3,而不是輸出第三個數值3。


          主站蜘蛛池模板: 国产av天堂一区二区三区| 激情内射亚洲一区二区三区爱妻| 亚洲国产av一区二区三区| 亚洲高清美女一区二区三区| 精品乱子伦一区二区三区高清免费播放 | 久久se精品一区二区| 国产一区二区三区乱码网站| 成人丝袜激情一区二区| 亚洲国产精品无码第一区二区三区 | 夜夜精品视频一区二区| 国产综合精品一区二区三区| 变态拳头交视频一区二区| 狠狠爱无码一区二区三区| 亚洲老妈激情一区二区三区| 亚洲中文字幕久久久一区| 无码日韩精品一区二区免费暖暖| 亚洲午夜精品第一区二区8050| 日韩精品一区二区三区国语自制| 无码一区18禁3D| 国产一区二区三区韩国女主播| 亚洲国产日韩一区高清在线 | 精品无码人妻一区二区三区品| 国产精品美女一区二区视频| 亚洲爆乳精品无码一区二区三区| 亚洲欧洲∨国产一区二区三区| 一本大道东京热无码一区| 国产爆乳无码一区二区麻豆| 久久国产免费一区| 国产韩国精品一区二区三区久久| 中文字幕乱码亚洲精品一区| 麻豆AV天堂一区二区香蕉| 国内精品一区二区三区东京| 日韩美女视频一区| 夜色阁亚洲一区二区三区| 国产成人精品无人区一区| 精品视频一区二区三区在线观看 | 亚洲无删减国产精品一区| 中文乱码字幕高清一区二区| 国产精品熟女视频一区二区| 国产精品一区二区三区99| 亚洲夜夜欢A∨一区二区三区|