从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函数使用等。在实际项目中,合理选择箭头函数或传统函数表达式取决于具体的需求和上下文。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Git客户端向gitee免密推送项目代码(保姆级流程哦)

1.进入Git官网手动下载git的客户端可执行程序 一路next即可 2.找到安装路径下的3.进入git-bash 根据如下的代码一次执行只需要修改对应的username和自己再gitee中绑定的邮箱 4.分发私钥到邮箱 产生私钥的时候回车三次即可;查看私钥如下图及正常; 5.进…

C++设计模式——工厂模式 :简单工厂、工厂方法、抽象工厂

工厂模式可以分为三种,简单工厂模式,工厂方法模式和抽象工厂模式。 那么,这三种工厂模式长啥样,又为啥会衍生出这三种模式来呢?本篇和大家一起来学习总结一下。 一、简单工厂模式 简单工厂SimpleFactory 负责创建所有…

Zabbix 6 详细安装部署教程

目录 一、安装 MySQL 数据库 二、安装 zabbix 监控平台 三、编辑配置文件 四、启动服务 五、zabbix-web 安装 zabbix web 出图展示乱码问题解决方案 zabbix 的安装部署非常简单,官方提供了四种安装途径,分别是二进制 rpm 包安装方式、源码安装方…

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据 该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。 介绍 鉴于机器学习和人工智能等应用的 FPGA 设计中硬件加速的兴起,现在是剥开几层“云雾”并讨论 HDL 之间来回传…

微信小程序仿网易严选(附精选源码32套,涵盖商城团购等)

商城主要实现的功能 首页、专题、分类、购物车、我的小程序授权登陆获取用户信息首页包含品牌制造页、品牌制造详情页面、新品首发页面、人气推荐页面、各分类列表商品详情页面,包含常见问题、大家都在看商品列表、加入购物车、收藏商品、立即购买、下订单、选择收…

在表格中显示字典的内容(根据后端返回的数据)vue3

进入页面,调接口,后端返回数据,indexType为0或者1,要用这个数据显示字典的内容 用插槽拿到数据 写一个函数,在模板中使用 const { proxy } getCurrentInstance(); // 字典-指标类型 const { index_type } proxy.u…

6.保留两位小数【2023.11.28】

1.问题描述 题中将给出一个具有许多小数位的浮点数,请将这个数字保存至小数点后两位,并输出。 2.解决思路 输入一个浮点数。 程序将浮点数保留两位小数并输出。 例如: formatted_float "{:.2f}".format(input_float)3.代码实…

echarts图表滚动条带动页面窗口滚动条的问题

网上搜了很多方法不管用,后来发现每次滚动echarts或者左右滑动echarts下方都会报错,报错提示如下,看看你们的图表是否这样报错: 报错信息如下:Unable to preventDefault inside passive event listener invocation 原…

三大录屏软件推荐,让你轻松录制屏幕

录屏软件的应用变得越来越广泛,无论是记录屏幕上的内容以方便日后查阅,还是与他人分享操作过程,录屏软件都发挥着重要作用。然而,市面上的录屏软件种类繁多,质量参差不齐。那有没有好用的录屏软件推荐呢?在…

金字塔原理

金字塔原理 来自于麦肯锡公司的第一位女性咨询顾问芭芭拉•明托的著作《金字塔原理》。 原理介绍 此原理是一种重点突出、逻辑清晰、主次分明的逻辑思路、表达方式和规范动作。 金字塔的基本结构是:中心思想明确,结论先行,以上统下&#xff…

小功能实现(十九)生成shp文件

引入依赖 <!--shp文件相关工具--><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geo…

矩阵连乘问题

1、求解矩阵连乘问题。 要求: 分别用自底向上的动态规划方法和自顶向下的备忘录方法计算最优值并构造最优解&#xff0c;通过实例比较两种方法的结果和效率。 思路 1)寻找最优子结构&#xff1a; 此问题最难就在于此&#xff0c;对于乘积的任意位置加括号都会将序列在某个…

Java 基础学习(三)循环流程控制与数组

1 循环流程控制 1.1 循环流程控制概述 1.1.1 什么是循环流程控制 当一个业务过程需要多次重复执行一个程序单元时&#xff0c;可以使用循环流程控制实现。 Java中包含3种循环结构&#xff1a; 1.2 for循环 1.2.1 for循环基础语法 for循环是最常用的循环流程控制&#xff…

智慧公厕为高速服务区公厕做出的贡献

在现代社会&#xff0c;科技的飞速发展改变了人们的生活方式&#xff0c;也深刻影响着城市的基础设施和公共服务。而在这个数字化时代的背景下&#xff0c;智慧公厕作为城市智能化管理的一部分&#xff0c;为高速服务区公厕带来了一系列的创新和贡献&#xff0c;为旅客的出行提…

C++基础 -10- 类的构造函数

类的构造函数类型一 使用this指针给类内参数赋值 class rlxy {public:int a;rlxy(int a, int b, int c){this->aa;this->bb;this->cc;cout << "rlxy" << endl;}protected:int b;private:int c; };int main() {rlxy ss(10, 20, 30); }类的构造…

\n\r:解析java中的\r、\n、\r\n、\n\r的区别

1 \r 1.1 内容 回车符,将光标定义到当前行行首 1.2 在idea中测试 1.2.1 表现形式 在\r后有新内容时,会先删除之前以前存在过的文本,即只打印\r后面的内容 1.2.2 示例代码 package Work; public class Test05 { public static void main(String[] args) { System.…

docker-compose Install OrangeHRM

OrangeHRM 前言 OrangeHRM 是一个全面的人力资源管理(HRM) 系统,它包含任何企业所需的所有基本功能。OrangeHRM旨在支持任何规模的团队,包括初创企业、中小企业以及大型跨国组织。 OrangeHRM 提前条件 OrangeHRMdocker & docker-composer 安装or

会议预告 | 求臻医学受邀参加2023·Inno China 产业创新大会

INNO CHINA 中国产业创新大会聚焦于数据驱动产业变革升级、医疗科技与产业转型升级、企业数字化转型升级、产业服务生态构建及商业智能融合发展等领域。如今&#xff0c;已成为中国新兴科技、热门赛道行业论坛、创新成果展示、参与、共创的高维度学术与产业年度相聚的节日&…

使用vue-admin-template时,需要注意的问题,包括一定要去除mock.js注释

在使用vue-admin-template等前端框架时&#xff0c;如果你没有打算用他们的mock数据&#xff0c;在生产环境下一定要注释mock引用的代码&#xff0c;虽然它没有被调用&#xff0c;但是如果你不注释&#xff0c;就会被打包进去。 找到main.js&#xff0c;看如下代码&#xff1a…

搭建一个可以发送邮箱验证码的接口,内含前端处理 接口返回、请求处理

环境搭建 在node安装好的情况下&#xff08;一般vue环境有的node也有 没有可以使用winr回车输入node -v 有版本号则已经安装好 找一个空文件夹作为此项目文件夹 点击上面的地址栏输入cmd回车 输入npm init -y 再输入npm install nodemailer安装发送邮件的插件 环境配置 使用v…