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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;帮助您在应急响…