JS箭頭函數

JavaScript 的箭頭函數 (Arrow Function) 是 ES6 (ECMAScript 2015) 引入的一種重要的函數語法特性,它用更簡潔的方式定義函數,并改變了 this 的綁定行為。

箭頭函數和傳統函數的主要區別:

特性箭頭函數傳統函數
語法更簡潔,省略 function 關鍵字使用 function 關鍵字
this 綁定繼承自外層詞法作用域(靜態)取決于調用方式(動態)
構造函數不能使用 new可以使用 new
arguments沒有自己的 arguments 對象有自己的 arguments 對象
原型沒有 prototype 屬性prototype 屬性
簡寫返回單行表達式可隱式返回必須顯式使用 return

🖋? 基本語法

箭頭函數的基本形式是 (參數) => { 函數體 }。根據參數和函數體的不同,有多種簡寫形式:

  • 無參數:括號不能省。

    const sayHello = () => { console.log("Hello!"); 
    };
    
  • 單個參數:可省略參數括號。

    const square = x => { return x * x; 
    };
    
  • 多個參數:需要用括號括起來。

    const add = (a, b) => { return a + b; 
    };
    
  • 單行表達式:可省略 {}return 關鍵字(隱式返回)。

    const multiply = (a, b) => a * b; // 隱式返回 a * b 的結果
    
  • 返回對象字面量:為了區分代碼塊,需要用括號包裹對象。

    const createUser = (name, age) => ({ name: name, age: age });
    

🔍 理解 this 的行為

箭頭函數最顯著的特征是 它沒有自己的 this,其 this 值繼承自定義它時的外部詞法作用域(即外層函數或全局作用域),并且一旦定義,this 指向就固定了,無法通過 call, apply, bind 等方法改變。

看一個例子理解傳統函數和箭頭函數中 this 的不同:

function Counter() {this.count = 0;// 傳統函數:this 指向取決于調用方式,setTimeout 中調用時 this 可能指向全局對象(如 window)setInterval(function() {this.count++; // 這里的 this 可能不是 Counter 實例console.log('Traditional:', this.count); // 可能輸出 NaN 或 undefined}, 1000);// 箭頭函數:繼承 Counter 函數作用域的 this,即 Counter 實例setInterval(() => {this.count++; // this 正確指向 Counter 實例console.log('Arrow:', this.count); // 正常遞增輸出}, 1000);
}const myCounter = new Counter();

再看一個對象字面量中的常見“陷阱”:

const obj = {value: 42,// 傳統函數作為方法:this 通常指向調用它的對象 objtraditionalMethod: function() {console.log(this.value); // 輸出 42},// 箭頭函數作為方法:this 繼承自外部作用域(假設是全局),而非 objarrowMethod: () => {console.log(this.value); // 可能輸出 undefined(全局無 value)}
};obj.traditionalMethod(); // 42
obj.arrowMethod(); // undefined (在瀏覽器中,外層可能是 window)

?? 箭頭函數的限制

因其特性,箭頭函數在以下場景不適用

  1. 不能作為構造函數:嘗試用 new 調用箭頭函數會拋出錯誤。

    const Foo = () => {};
    const bar = new Foo(); // TypeError: Foo is not a constructor
    
  2. 沒有 prototype 屬性:因此不能用于定義構造函數原型上的方法。

    const Arrow = () => {};
    console.log(Arrow.prototype); // undefined
    
  3. 沒有自己的 arguments 對象:在箭頭函數內訪問 arguments 會引用外部函數的 arguments。如需訪問參數,可使用剩余參數(Rest Parameters)。

    const showArgs = (...args) => {console.log(args); // 使用剩余參數 args 是一個數組
    };
    showArgs(1, 2, 3); // [1, 2, 3]
    
  4. 不能用作生成器(Generator):無法在箭頭函數中使用 yield 關鍵字。

🎯 適用場景與最佳實踐

優先使用箭頭函數的場景

  • 回調函數:特別是在數組方法(如 map, filter, reduce, forEach)、setTimeoutsetInterval 或事件監聽器(若無需通過 this 訪問事件目標)中,可避免 bindvar self = this 的寫法。

    // 數組方法
    const numbers = [1, 2, 3];
    const doubled = numbers.map(num => num * 2); // [2, 4, 6]// setTimeout
    setTimeout(() => {console.log('This runs after 1 second.');
    }, 1000);
    
  • 需要固定 this 的場景:當你明確希望函數使用定義時的 this,而不是調用時的 this

  • 函數式編程:編寫短小的純函數或高階函數時,語法更簡潔。

避免或謹慎使用箭頭函數的場景

  • 對象方法:若方法需要通過 this 訪問對象自身的其他屬性,應使用傳統函數。
  • 事件處理函數:若需要通過 this 訪問觸發事件的 DOM 元素,應使用傳統函數(除非使用事件對象或其他方式)。
  • 原型方法:定義在原型上的方法通常需要動態 this,應使用傳統函數。
  • 構造函數:箭頭函數不能作為構造函數。

💡 更多技巧

  • 默認參數:和傳統函數一樣,箭頭函數支持默認參數。

    const greet = (name = 'Guest') => {console.log(`Hello, ${name}!`);
    };
    greet(); // Hello, Guest!
    
  • 剩余參數(Rest Parameters):用于獲取不確定數量的參數。

    const sumAll = (...numbers) => {return numbers.reduce((acc, num) => acc + num, 0);
    };
    console.log(sumAll(1, 2, 3)); // 6
    
  • 參數解構:可以在參數中直接解構對象或數組。

    const userInfo = ({name, age}) => {console.log(`${name} is ${age} years old.`);
    };
    userInfo({name: 'Alice', age: 30}); // Alice is 30 years old.
    

📊 總結:如何選擇

場景舉例推薦使用原因
數組方法回調 (map, filter)箭頭函數語法簡潔,this 行為通常符合預期
setTimeout / setInterval箭頭函數避免 this 指向問題,無需額外綁定
對象方法傳統函數需要動態 this 指向調用它的對象
事件處理函數 (需要 event.target)傳統函數需要動態 this 指向綁定事件的元素 (或使用事件對象的 currentTarget)
構造函數傳統函數箭頭函數不能用作構造函數
原型方法傳統函數需要動態 this 指向實例
需要 arguments 對象傳統函數箭頭函數沒有自己的 arguments

選擇箭頭函數還是傳統函數,關鍵在于判斷是否需要函數有自己的 this 上下文,以及代碼的簡潔性和可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95268.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux內核 - 文件系統相關的幾個概念介紹

介紹文件系統之前,先了解下存儲管理的幾個概念:1. 硬盤:是最底層的存儲介質,比如 /dev/sda, /dev/nvme0n1. 一個物理硬盤就是一個塊設備,未經處理是只能順序讀寫二進制數據。 2. 分區:就是在硬盤上劃分出不…

邊緣計算(Edge Computing)+ AI:未來智能世界的核心引擎

邊緣計算(Edge Computing) AI:未來智能世界的核心引擎 文章目錄邊緣計算(Edge Computing) AI:未來智能世界的核心引擎摘要什么是邊緣計算?為什么需要邊緣計算?1. 延遲問題2. 帶寬壓力…

計算機視覺與深度學習 | ORB-SLAM3算法原理與Matlab復現指南

文章目錄 一、算法核心原理 1.1 系統架構概述 1.2 數學模型基礎 1.2.1 狀態估計框架 1.2.2 視覺-慣導融合模型 1.3 關鍵創新點 二、關鍵模塊實現細節 2.1 ORB特征提取與匹配 2.2 地圖初始化 2.3 視覺-慣導融合 2.4 回環檢測與優化 三、Matlab復現思路 3.1 系統模塊劃分 3.2 核心…

分布式光伏模式怎么選?從 “憑經驗” 到 “靠數據”,iSolarBP 幫你鎖定最優解

iSolarBP-陽光新能源旗下分布式光伏光儲智能評估設計軟件 iSolarBP是陽光新能源打造的分布式光伏/光儲項目智能設計平臺。提供無人機自動勘測、3D建模、高精度發電仿真、光儲容量優化與經濟分析一站式服務,助力開發者提升效率、降低成本和優化投資收益。https://iso…

MATLAB R2010b系統環境(四)MATLAB幫助系統

一、幫助命令MATLAB幫助命令包括help、lookfor以及模糊查詢。1.1 help命令在命令窗口中直接輸入help或help加函數名。(1)help:顯示當前幫助系統中所包含的所有項目,即搜索路徑中所有的目錄名稱,如下圖:&…

“便農惠農”智慧社區系統(代碼+數據庫+LW)

摘要 隨著城市化進程加速和信息技術快速發展,傳統社區管理模式已難以滿足現代社區高效管理和居民多元化服務需求。為解決社區管理中的信息孤島問題、提升服務效率并增強居民生活體驗,本文設計并實現了一套基于Spring Boot框架的智慧社區管理系統。該系統…

智慧金融服務平臺問題剖析與改進策略

智慧金融服務平臺問題剖析與改進策略 在數字化浪潮的推動下,智慧金融服務平臺蓬勃發展,為用戶帶來了便捷的金融服務體驗。然而,隨著用戶數量的不斷增加和業務的日益復雜,平臺也暴露出一些問題,其中數據準確性不足、異常…

【Vue2?】Vue2 入門之旅(三):數據與方法

在前兩篇文章中,我們學習了 Vue 的基礎和模板語法。本篇我們將深入 數據與方法,理解 data、methods、computed、watch 的作用和區別。 目錄 datamethodscomputedwatch小結 data Vue 實例中的 data 是數據源,模板會自動響應其中的變化。 &l…

自動化測試時,chrome瀏覽器啟動后閃退的問題

之前運行的好好的,最近再次練習時發現會閃退,然后發現是驅動版本老的問題 (1)下載與之匹配的驅動器版本 Chrome for Testing availability 找到與Chrome版本前3位相同的目錄,下載對應系統的壓縮包 (2&am…

Dynamics 365 XrmToolBox工具之Clone Field Definitions

好久沒有分享XrmToolBox的組件了,今天要分享的是下圖中這個組件在建實體的時候,我們經常會碰到實體間一些字段存在重復,或者都可以直接復制黏貼加一些少量修改就可以生成第二個實體,但如果僅從D365本身來說,要做到復制…

UBUNTU之Onvif開源服務器onvif_srvd:1、編譯

下載源碼 編譯時會下載東西,有可能需要VPN。 https://github.com/KoynovStas/onvif_srvd https://github.com/KoynovStas/onvif_srvd/tags 解壓準備工作 sudo apt install -y flex bison byacc make cmake m4# for support encryption and WS-Security # 在低版…

深度學習跨領域應用探索:從技術落地到行業變革

深度學習不再是實驗室里的 “高精尖技術”,而是滲透到各行各業的 “效率引擎”。它憑借強大的數據擬合與特征提取能力,在計算機視覺、自然語言處理、金融風控等領域打破傳統技術瓶頸,甚至催生出全新的業務模式。本文將深入不同行業場景&#…

計算機網絡:數據庫(sqlite3)

一、常用的數據庫ORACLE&#xff08;大型&#xff09;、Mysal&#xff08;開源常用&#xff09;、SQL server、Access、Sybse、Windows NT二、sqlite3&#xff08;一&#xff09;特性&#xff1a;<1>零配置&#xff0c;無需安裝和配置<2>儲存在單一磁盤文件中的一個…

Web開發:使用Quartz庫結合WebAPI根據任務列表定時執行相應邏輯

一、實體及文件結構public class JobSchedule {public string Id { get; set; }public string Title { get; set; }public string Cron { get; set; } }二、服務類后臺服務類初始化時會調用此類的StartAsync方法public class QuartzService : IQuartzService {private readonly…

數據結構棧的應用

1.棧的應用 后入先出的有序列表//無法進行小數、負數計算&#xff0c;除法計算為在除法步驟時舍棄小數部分public static void main(String[] args) {//雙棧實現計算器功能,思路//1.定義數棧1、符號棧2、掃描指針index&#xff0c;從前往后掃描表達式序列//2.遇到數字&#xff…

npm 打包上傳命令,撤銷錯誤版本

添加npm用戶賬號npm adduser上傳包命令npm publish撤銷錯誤版本example&#xff1a;npm unpublish longze-guide0.1.0 --forcepackage.json example{"name": "longze-guide","version": "0.1.1","private": false,"des…

Python爬蟲實戰:研究Pyplot模塊,構建IMDb數據采集和分析系統

1. 引言 1.1 研究背景 在大數據時代,互聯網蘊含著海量有價值的信息,如何高效獲取并分析這些信息成為各行各業的重要需求。網絡爬蟲作為一種自動化數據采集工具,能夠按照預定規則從網頁中提取所需信息,為數據分析提供基礎數據支撐。而數據可視化則是將抽象數據轉化為直觀圖…

算術邏輯運算指令 (匯編)

乘除運算指令MUL指令實現兩個無符號操作數的乘法運算。乘數是OPRD&#xff0c;被乘數位于AL、AX或EAX中&#xff08;由OPRD的尺寸決定&#xff0c;乘數和被乘數的尺寸一致&#xff09;。乘積尺寸翻倍&#xff1a;16位乘積送到AX&#xff1b;32位乘積送DX:AX&#xff1b;64位乘積…

Agentless:革命性的無代理軟件工程方案

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 01. 什么是Agentless&#xff1f; Agentless是由伊利諾伊大學香檳分校…

CVE Push Service | 高危漏洞實時情報自動化推送工具

工具介紹 &#x1f525; CVE Push Service | 自動化高危漏洞情報推送 ? 面向網絡安全從業者的 高危漏洞實時情報推送工具 自動拉取 NVD 最新漏洞數據&#xff0c;篩選 CVSS ≥ 7.0 的高危漏洞&#xff0c;并通過 Server醬3 第一時間推送到您的設備&#xff0c;幫助您在應急響…