从0开始学习JavaScript--JavaScript 箭头函数

在这里插入图片描述

JavaScript的现代语法,箭头函数(Arrow Functions)是一个不可忽视的重要部分。它们不仅提供了更简洁的语法,还改变了函数的作用域规则。在这篇文章中,将深入研究JavaScript箭头函数的概念、语法、用法以及它们与传统函数表达式的区别。

什么是箭头函数?

箭头函数是ES6(ECMAScript 2015)引入的一种新的函数语法。它们提供了一种更简短的语法来声明函数,并且具有词法作用域的特性,即它们继承了父级作用域的this值。让我们通过一些例子来深入了解箭头函数的基本语法。

基本语法

// 传统函数表达式
const add = function(a, b) {return a + b;
};// 箭头函数
const addArrow = (a, b) => a + b;console.log(add(2, 3));      // 输出: 5
console.log(addArrow(2, 3)); // 输出: 5

在这个例子中,我们分别使用传统函数表达式和箭头函数来声明一个简单的加法函数。箭头函数的语法更为简洁,尤其适用于短小的函数体。

词法作用域

箭头函数具有词法作用域,这意味着它们继承了父级作用域的this值。看下面的例子:

function Counter() {this.count = 0;// 传统函数表达式setInterval(function() {this.count++;console.log('Traditional:', this.count);}, 1000);// 箭头函数setInterval(() => {this.count++;console.log('Arrow:', this.count);}, 1000);
}const counter = new Counter();

在传统函数表达式中,setInterval 中的函数会创建一个新的this值,导致this.count无法正确访问。而在箭头函数中,它会继承Counter函数的this值,使得this.count能够正确递增。

箭头函数的用法

1. 简化函数体

箭头函数在函数体较为简单的情况下能够提供更简洁的语法:

// 传统函数表达式
const square = function(x) {return x * x;
};// 箭头函数
const squareArrow = x => x * x;console.log(square(5));      // 输出: 25
console.log(squareArrow(5)); // 输出: 25

2. 没有this绑定

在箭头函数中,不存在this绑定的问题,它会捕获所在上下文的this值:

function Person() {this.age = 0;// 传统函数表达式setInterval(function growUp() {this.age++;console.log('Traditional:', this.age);}, 1000);// 箭头函数setInterval(() => {this.age++;console.log('Arrow:', this.age);}, 1000);
}const person = new Person();

在传统函数表达式中,growUp 函数的this值会变为window,导致this.age无法正确访问。而在箭头函数中,它会正确地捕获Person对象的this值。

3. 更简洁的返回语句

当函数体只有一个表达式时,箭头函数可以省略花括号并且自动返回表达式的值:

// 传统函数表达式
const multiply = function(a, b) {return a * b;
};// 箭头函数
const multiplyArrow = (a, b) => a * b;console.log(multiply(2, 3));      // 输出: 6
console.log(multiplyArrow(2, 3)); // 输出: 6

4. 适用于回调函数

箭头函数在处理回调函数时尤其方便,因为它们不会创建新的this值,避免了传统函数表达式中需要使用bind或者that等方式来确保正确的this值。

const numbers = [1, 2, 3, 4, 5];// 传统函数表达式
const squared1 = numbers.map(function(n) {return n * n;
});// 使用箭头函数
const squared2 = numbers.map(n => n * n);console.log(squared1); // 输出: [1, 4, 9, 16, 25]
console.log(squared2); // 输出: [1, 4, 9, 16, 25]

在这个例子中,箭头函数更加简洁,避免了传统函数表达式中的冗余代码。

箭头函数与传统函数表达式的区别

1. 没有arguments对象

箭头函数没有自己的arguments对象,它继承自父级作用域。这可能导致一些潜在的问题,因为修改箭头函数中的arguments会影响到父级作用域。

function traditionalFunction() {setTimeout(function() {console.log(arguments); // 输出: [1, 2, 3]}, 100);
}function arrowFunction() {setTimeout(() => {console.log(arguments); // 输出: Uncaught ReferenceError: arguments is not defined}, 100);
}traditionalFunction(1, 2, 3);
arrowFunction(1, 2, 3);

在箭头函数中,尝试访问arguments会导致Uncaught ReferenceError。如果需要使用参数,可以使用剩余参数语法...args

2. 没有prototype属性

箭头函数没有prototype属性,因此无法作为构造函数使用,不能通过new关键字来实例化。

const TraditionalConstructor = function() {};
const ArrowConstructor = () => {};const instance1 = new TraditionalConstructor(); // 正常
const instance2 = new ArrowConstructor(); // 报错: ArrowConstructor is not a constructor

3. 不能用作Generator函数

传统函数表达式可以通过function*语法声明Generator函数,而箭头函数不支持这种语法。

function* traditionalGenerator() {yield 1;
}const arrowGenerator = function*() { // 正确yield 1;
};const arrowGeneratorError = *() => { // 报错: Unexpected token '*'yield 1;
};

总结

在本文中,深入研究了JavaScript箭头函数的概念、语法和用法。箭头函数不仅提供了更简洁的语法,还解决了传统函数表达式中this值的问题。我们探讨了箭头函数在不同场景下的应用,包括简化函数体、避免this绑定问题以及作为回调函数的方便性。

然而,也强调了箭头函数与传统函数表达式之间的一些区别,如缺少arguments对象、没有prototype属性以及不能作为Generator函数使用等。在实际项目中,合理选择箭头函数或传统函数表达式取决于具体的需求和上下文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sourceTree的下载和安装

sourceTree的下载和安装 一、概述 SourceTree 是一款免费的 Git 和 Hg 客户端管理工具,支持 Git 项目的创建、克隆、提交、push、pull 和合并等操作。它拥有一个精美简洁的界面,大大简化了开发者与代码库之间的 Git 操作方式,这对于不熟悉 …

Session 与 JWT 的对决:谁是身份验证的王者? (上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

一个网站,四种创建制作电子期刊的方法

想象一下,你正在走进一家神奇的商店,里面陈列着各种精美的杂志和期刊。但是,这些杂志和期刊并不是印刷品,而是可以直接在网站上制作和发布的电子期刊。 但是像这样能在网上发的电子期刊该怎么制作呢?不知道如何制作的小…

第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程

USE mydata; #请在此处添加实现代码 ########## Begin ########## DELIMITER $ CREATE PROCEDURE PROC_AVGWEIGHT(IN SNO VARCHAR(10), IN JNO VARCHAR(10), OUT AVG_WEIGHT INT) BEGINSELECT ROUND(SUM(P.WEIGHT * SPJ.QTY) / SUM(SPJ.QTY)) INTO AVG_WEIGHTFROM PJOIN SPJ ON…

VBA数据库解决方案第七讲:如何利用Recordset对象打开数据库的数据记录集

《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

信而泰 SSL测试方法介绍

[本文介绍在ALPS平台上进行SSL测试的内容和方法] 什么是SSL SSL全称是Secure Sockets Layer,指安全套接字协议,为基于TCP的应用层协议提供安全连接;SSL介于TCP/IP协议栈的第四层和第五层之间,广泛用于电子商务、网上银行等。 SSL…

SQL数据库知识点总结

前后顺序可以任意颠倒,不影响库中的数据关系 关系数据库的逻辑性强而物理性弱,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中的数据关系 一名员工可以使用多台计算机(1:m),而一…

深入了解c语言中的结构体

介绍: 在C语言中,结构体是一种用户自定义的数据类型,它允许我们将不同类型的数据组合在一起,形成一个更为复杂的数据结构。结构体可以用来表示现实世界中的实体,如人员、学生、图书等。本篇博客将介绍结构体的基本概念…

2023版本idea插件开发踩坑记录(一)

在进行idea开发的时候,开始仿照着写第一个插件hello world的时候,运行的时候一直运行不成功。参考了很多博客都是如此 后面对官方文档读了一遍,就发现其中的原委,这个的话估计会有很多人跟我一样踩坑 具体原因是,idea插…

python之pyqt专栏11-事件(QEvent)

QApplication.exec() 在main.py中,实例化app对象,然后在 sys.exit(app.exec())中调用app.exec(), if __name__ __main__:# 实例化应用app QApplication(sys.argv)# 实例化MyMainFormmyw MyMainForm()myw.show()# 启动应用程序的事件循环并…

selenium使用记录

本文记录python环境下使用selenium的一些步骤 Step1:安装并配置驱动 pip install selenium # 使用pip在对应python中安装selenium包为了让selenium能调用指定的浏览器,需要下载对应浏览器的驱动程序(这里以edge为例子) #Firefo…

Git 分支详解

目录 1. Git 分支管理 2. 如何自己创建分支? 3. 创建分支修改内容,之后合并到主分支 4. 删除分支 5. 出现 merge 冲突如何解决 6. 分支策略 前言 之前只是知道有 master 分支这个东西,但是具体是啥意思还是不知道,今天详…

卫星影像数据查询网址(WORLDVIEW1/2/3/4、PLEIADES、SPOT系列、高景、高分1-7、资源系列、吉林一号等)

商业卫星影像数据查询网址(WORLDVIEW1/2/3/4、PLEIADES、SPOT系列、高景、高分1-7、资源系列、吉林一号等) 1、资源卫星应用中心 网址:http://www.cresda.com/CN/ 可查询国产高分1、2、3、4、5、6、7号卫星,资源三号、资源三号…

用HeidiSQL在MySQL中新建用户

用HeidiSQL登录到MySQL数据库,注意登录的时候要使用有权限的用户: 选择工具-》用户管理: 点击左上角的“添加”: 输入用户名、密码,并且分配权限: 点击右边的“添加对象”: 可以根据自己…

系统托盘区句柄研究和C#基本托盘编程

因为我的系统托盘区小图标有时候会不可见,在还是在; 研究一下系统托盘区的句柄,是否每个小图标是一个单个窗口,就像form的button一样; 下图句柄工具,把问号拖动到窗口上,就会显示该窗口的句柄和窗口类等信息; 拖到系统托盘区看一下;拖到任何一个小图标上面,都只显示…

使用VC++设计程序实现K近邻中值滤波器(KNNMF)、最小均方差滤波器、矢量中值滤波算法进行滤波

VC实现若干种图像滤波技术2 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章: 01- 一元熵值、二维熵值 02- 图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 …

【Flink】容错机制

目录 1、检查点 ​编辑1.1 检查点的保存 1.1.1 周期性的触发保存 1.1.2 保存的时间点 1.1.3 时间点的保存与恢复 1.1.3.1保存 ​编辑 1.1.3.2 恢复的具体步骤: 1.2 检查点算法 1.2.1 检查点分界线(Barrier) 1.2.2 分布式快照算法(Barrier对齐的精准一次) 1.2.…

HTML简介

1,网页 网页的相关概念 1.1,什么是网页? 网页是构成网站的基本元素,它通常由图片,链接,文字,声音,视频等元素组成。其实就是一个常见以.htm或.html后缀结尾的文件,因此…

页面表格高度自适应

前言 现在后端管理系统主页面基本都是由三部分组成 查询条件,高度不固定,可能有的页面查询条件多,有的少表格,高度不固定,占据页面剩余高度分页,高度固定 这三部分加起来肯定是占满全屏的,那么我…

零基础上手,秒识别检测,IDEA研究院发布全新T-Rex模型

目标检测作为当前计算机视觉落地的热点技术之一,已被广泛应用于自动驾驶、智慧园区、工业检测和卫星遥感等场景。开发者在研究相关目标检测技术时,通常需熟练掌握图像目标检测框架,如通用目标检测框架 YOLO 系列,旋转目标检测框架…