輕鬆學習 JavaScript——第 6 部分:JavaScript 箭頭函數

来源:http://www.cnblogs.com/html5tricks/archive/2017/11/28/7912206.html
-Advertisement-
Play Games

JavaScript箭頭函數是ECMAScript 6中引入的編寫函數表達式的一種簡便方法。通常,在JavaScript中,可以通過兩種方式創建函數: 函數語句。 函數表達式。 可以如下所示創建函數語句: 也可以創建相同功能的函數表達式,如下所示: ECMA 2015(或ECMA Script 6) ...


JavaScript箭頭函數是ECMAScript 6中引入的編寫函數表達式的一種簡便方法。通常,在JavaScript中,可以通過兩種方式創建函數:

  • 函數語句。
  • 函數表達式。

可以如下所示創建函數語句:

function add(num1, num2) {
    var res = num1 + num2;
    return res;
}
var sum = add(7, 2);
console.log(sum);

也可以創建相同功能的函數表達式,如下所示:

var add = function (num1, num2) {
    var res = num1 + num2;
    return res;
}
var sum = add(7, 2);
console.log(sum);

ECMA 2015(或ECMA Script 6)引入了更短的語法來編寫函數表達式,稱為箭頭函數。使用箭頭函數,你可以將上面的函數表達式編寫為:

var add = (num1, num2) => { return num1 + num2; };

正如你所看到的,使用箭頭函數編寫的函數表達式更短。

箭頭函數的基本語法規則

首先,參數應該在小括弧中傳遞。你可以創建有兩個參數的箭頭函數,如下所示:

ar add = (num1, num2) => { return num1 + num2; };

如果只要傳遞一個參數,那麼括弧是可選的,可以選擇忽略。你可以創建一個參數的箭頭函數,如下所示:

var add = num => { return num * 10; };

如果沒有參數,那麼你必須要有一個空括弧——不能沒有。所以對於沒有參數的函數,箭頭函數是這樣寫的:

var add = () => { console.log("hey foo") };

如果函數中有單個表達式或語句:

  • 在主體中使用括弧是可選的。
  • 使用return語句是可選的。

你可以重寫add函數,而不使用函數體中的括弧和return語句,如下所示:

var add = (num1, num2) => num1 + num2;

你也可以使用控制台語句編寫不帶參數的函數,如下所示:

var add = () => console.log("hey");

返回對象字面量

JavaScript箭頭函數也可以返回對象字面量。唯一的要求是你需要把返回對象裝入小括弧中,如下所示:

var foo = (name, age) => ({
    name: name,
    age: age
})
var r = foo("my cat", 22);
console.log(r);

正如你所看到的那樣,要返回的對象被放在了小括弧內。如果你不這樣做,那麼JavaScript將無法區分對象字面量和函數體。

箭頭函數支持rest參數

JavaScript箭頭函數支持另一個ES6功能:rest參數。你可以在箭頭函數中使用rest參數,如下麵的代碼所示:

var add = (num1, num2, ...restparam) => {
    console.log(restparam.length);
    var result = num1 + num2;
    return result;
}
var r = add(67, 8, 90, 23);
console.log(r);

在這個例子中,當你使用帶有rest參數的箭頭函數時,輸出會是2和75,因為傳遞的額外參數的數量是2,num1和num2的總和是75。

箭頭功能支持預設參數

另外,JavaScript箭頭函數還支持另一個ES6功能:預設參數。此處詳細介紹了預設參數。你可以在箭頭函數中使用預設參數,如下所示:

var add = (num1 = 9, num2 = 8) => {
    var result = num1 + num2;
    return result;
}
var r = add();
console.log(r);

在上面的代碼中,箭頭函數中有預設參數。調用該函數時,我們沒有傳遞任何值,並且由於預設參數的存在,輸出將是17。

“this”在箭頭函數中如何工作?

箭頭函數沒有它自己的this值。箭頭函數中的this值總是從封閉範圍繼承。在JavaScript中,每個函數都有它自己的this值,這取決於代碼是如何調用函數的。請仔細看下麵列出的代碼:

var Cat = {
    name: 'mew',
    canRun: function () {
        console.log(this)
        var foo = () => { console.log(this) }
        foo();
    }
};

在這裡,cat是一個對象字面量,它包括:

  • 屬性名稱。
  • 方法canRun。

在canRun方法中,我們創建了一個箭頭函數foo,給出了this值。由於箭頭函數沒有它自己的this值,所以它將從周圍的函數獲取,因此,你將得到:

正如你所看到的,this值在canRun方法和箭頭函數foo中是相同的。箭頭函數從繼承範圍得到this值。如果你對此不甚清楚,那麼請牢記以下兩條規則:

  • 使用object.method在方法中獲取一個有意義的對象作為this值。
  • 對於任何其他要求,使用箭頭函數,由於函數沒有自己的this值,所以它將繼承封閉範圍的this值。

使用箭頭函數的限制條件

應用箭頭函數時要註意的一些限制條件:

  • 箭頭函數沒有參數對象。
  • 箭頭函數不能與新運算符一起使用,因此它不能用作構造函數。
  • 箭頭函數沒有原型屬性。

如果你嘗試使用箭頭函數作為構造函數,那麼你會得到異常。請看下麵的代碼:

var foo = (name, age) => { name = name, age = age };
var f1 = new foo("cat", 6);

代碼試圖通過使用箭頭函數foo作為構造函數來創建對象f1,JavaScript將拋出以下異常:

而且,當你試圖輸出箭頭函數的原型值時,你會得到undefined的輸出:

var foo = (name, age) => { name = name, age = age };
console.log(foo.prototype);

發生這種情況的原因是因為箭頭函數沒有原型屬性。請記住:雖然箭頭函數為你提供了編寫函數表達式的簡短方法,但它沒有自己的this值,也不能用作構造函數。

系列目錄

輕鬆學習 JavaScript——第 1 部分:瞭解 let 語句

輕鬆學習 JavaScript——第 2 部分:函數中的 Rest 參數

輕鬆學習 JavaScript——第 3 部分:函數中的預設參數

輕鬆學習 JavaScript——第 4 部分:函數中的 arguments 對象

輕鬆學習 JavaScript——第 5 部分:簡化函數提升

輕鬆學習 JavaScript——第 6 部分:JavaScript 箭頭函數


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為了讓自己的電腦相對安全一些,我安裝了ubuntu的物理機 因為要經常輸入漢字,我就在unbuntu裡面安裝了搜狗輸入法 1.在搜狗輸入法官網下載Linux版本的安裝包:http://pinyin.sogou.com/linux/,記住下載自己機子對應的版本(看清楚是32位還是64位) 2.找到文件 ...
  • 一、企業服務架構圖及負載均衡的要求 1、場景說明 在企業生產環境中,每天會有很多的需求變更,比如增加伺服器、新業務上線、url路由修改、功能變數名稱配置等等,對於前端負載均衡設備來說,容易維護,複雜度低,是首選指標。在企業中,穩定壓倒一切,與其搞得很複雜,經常出問題,不如做的簡單和穩定。 在企業中,90%以 ...
  • 什麼是迭代器模式? 迭代器模式(Iterator):提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內部表示。 何時使用迭代器模式? 當需要訪問一個聚合對象,而且不管這些對象是什麼都需要遍歷的時候,需要考慮使用迭代器模式。 迭代器模式的組成 Iterator:迭代器抽象類,用於定義得到 ...
  • 裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。 類圖分析 我們先假設一個業務場景,有三種房子需要裝修,分別是公寓,木屋和別墅,裝修的方式有刷牆和擺滿鮮花。那麼應用裝飾模式以後的類圖結構如下所示: 這個結構似乎與 " ...
  • 簡介: html-webpack-plugin 是一個webpack插件,它簡化了註入webpack打包文件的html的創建。當webpack打包文件使用哈希值作為文件名並且每次編譯的哈希值都不同時尤其有用。你可以使用lodash模板來創建html文件,也可以使用你自己的載入器。 安裝: 第三方插件 ...
  • 1、表格實現 display:table- cell屬性類似於td標簽。會受一些css屬性破壞:float,position:absolute;display與這些樣式同用會失去效果。而且table-cell對margin無反應。 2、inline-block設置垂直居中 3、flex佈局實現居中 ...
  • 表格是一個組合標簽,用來佈局,相容性好;現在佈局思路大多數是div+Css。 對於表格標簽做了一下概述,認識一下。表格的頭部<thead></thead,和<tfoot></tfoot>可以省略,主要樣式如下 <tr></tr>表格的行,<td></td>表格的單元格。 表格標簽類型及特性: 1,單 ...
  • 針對vue中控制項的用法 首先 初步用法 }) 子組件調用父組件的方法 和父組件傳值入子組件 子組件: 父組件 : 動態切換不同的組件 在掛載點使用component標簽,然後使用v-bind:is=”組件名”,會自動去找匹配的組件名,如果沒有,則不顯示; 改變掛載的組件,只需要修改is指令的值即可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...