从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),而一…

给Web3应用新增区块链数据(Web3项目一实战之六)

当您在浏览首页以卡片形式来展示区块链列表数据(Web3项目一实战之五)时,不禁发问,既然首页读取了区块链列表数据,那么,那些列表数据总得在哪个页面进行添加进去吧!绝不会凭空冒出这许多数据的。 没错,如您所想,也正是您所猜测的那般,DApp与传统App一样,数据也是需要…

[Swift]RxSwift常见用法详解

RxSwift 是 ReactiveX API 的 Swift 版。它是一个基于 Swift 事件驱动的库,用于处理异步和基于事件的代码。 GitHub:https://github.com/ReactiveX/RxSwift 一、安装 首先,你需要安装 RxSwift。你可以使用 CocoaPods,Carthage 或者 Swift …

HNU 练习八 结构体编程题6. 青蛙与蚊子

【问题描述】 有 n 只青蛙位于坐标轴 OX 上,对于每只青蛙,有两个已知值 xi、ti,表示第 i 只青蛙在坐标的位置(各不相同)以及它的舌头的长度。同样有 m 只蚊子一只接一只的落到坐标轴上,对于每只蚊子&#x…

向zabbix服务端发请求的例子

build\win32\examples\zabbix_sender\sender.c int main(int argc, char *argv[]) {if (5 == argc){char *result =

代码随想录算法训练营第四十一天| 343 整数拆分 96 不同的二叉搜索树

目录 343 整数拆分 96 不同的二叉搜索树 343 整数拆分 class Solution {public int integerBreak(int n) {int f[] new int[n 1];if(n 2)return 1;f[2] 1;f[3] 2;for(int i 3;i < n;i){for(int j 1;j < i - j;j){f[i] Math.max(f[i],Math.max(j * f[i - j],j …

Windows 安装 flash-attention 和 bitsandbytes

首先保证cuda版本为12.1&#xff0c;torch版本为2.1.0及以上&#xff0c;python版本3.10以上 从此处下载最新版的whl&#xff0c;https://github.com/jllllll/bitsandbytes-windows-webui/releases/tag/wheels&#xff0c;通过whl来安装bitsandbytes 从此处下载最新版的whl&a…

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

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

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

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

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

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

selenium使用记录

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

Git 分支详解

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

四川成都数字创新大赛-3,数据二十条:三权分置,CMM是什么认证,等保是什么

目录 数据二十条:三权分置 一、数据资源持有权 二、数据加工使用权

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

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