JavaScript:箭头函数与普通函数的区别与适用场景

news2025/1/13 16:43:08

文章目录

  • 1 箭头函数与普通函数的区别
    • 1.1 语法上的区别
    • 1.2 this指向的区别
    • 1.3 arguments对象的区别
    • 1.4 箭头函数不能用作构造函数
  • 2 箭头函数和普通函数的适用场景
    • 2.1 普通函数的适用场景
      • 2.1.1 构造函数
      • 2.1.2 方法
      • 2.1.3 回调函数
    • 2.2 箭头函数的适用场景
      • 2.2.1 简答的回调函数
      • 2.2.2 隐式返回

1 箭头函数与普通函数的区别

1.1 语法上的区别

箭头函数使用箭头(=>)来定义函数,而普通函数使用function关键字来定义函数。

箭头函数通常是 匿名函数,所以需要将其赋值给一个变量或者作为参数传递给另一个函数。

示例:

// 普通函数
function add01(x, y) {
    return x + y;
}

console.log('普通函数输出结果:', add01(1,3));	//普通函数输出结果: 4

// 箭头函数,赋值给一个变量
const add02 = (x, y) => {
    return x + y;
};

console.log('箭头函数输出结果:', add02(1,3));	//箭头函数输出结果: 4

// 箭头函数作为参数传递给另一个函数
function myFunc(res) {
    res();
}

myFunc(() => {
    var a = 10;
    console.log('箭头函数作为普通函数的参数:', a);
});	//箭头函数作为普通函数的参数: 10

1.2 this指向的区别

在普通函数中,this指向的是调用该函数的对象,也就是函数的执行上下文。而在箭头函数中,this指向的是定义该箭头函数时所在的上下文,也就是箭头函数所在的函数或者全局对象。

示例:

var name = 'Jerry';

// 普通函数中的this
const person01 = {
  name: 'Tom',
  age: '18',
  sayHi: function() {
    console.log(`Hi, my name is ${this.name}.`);
    console.log(`Hi, my age is ${this.age}.`);
  }
};
person01.sayHi(); // Hi, my name is Tom. Hi, my age is 18.

// 箭头函数中的this
const person02 = {
  name: 'Tom',
  age: '18',
  sayHi: () => {
    console.log(`Hi, my name is ${this.name}.`);
    console.log(`Hi, my age is ${this.age}.`);
  }
};
person02.sayHi(); // Hi, my name is Jerry. Hi, my name is undefined.

在上面的例子中,普通函数中的this指向的是person对象,而箭头函数中的this指向的是全局对象(因为箭头函数没有自己的this,所以它继承了外层函数的this值)。

完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var name = 'Jerry';

        // 普通函数中的this
        const person01 = {
            name: 'Tom',
            age: '18',
            sayHi: function () {
                console.log(`Hi, my name is ${this.name}.`);
                console.log(`Hi, my age is ${this.age}.`);
            }
        };
        person01.sayHi(); // Hi, my name is Tom. Hi, my age is 18.

        // 箭头函数中的this
        const person02 = {
            name: 'Tom',
            age: '18',
            sayHi: () => {
                console.log(`Hi, my name is ${this.name}.`);
                console.log(`Hi, my age is ${this.age}.`);
            }
        };
        person02.sayHi(); // Hi, my name is Jerry. Hi, my name is undefined.
    </script>
</body>

</html>

输出结果:

在这里插入图片描述

1.3 arguments对象的区别

在普通函数中,arguments对象是一个类数组对象,包含了函数所有的参数。

而在箭头函数中,arguments对象是不存在的,需要使用Rest参数来获取所有的参数,它允许函数接收任意数量的参数并将它们存储在一个数组中。Rest 参数使用三个点(...)符号表示,后面跟着一个参数名。当函数使用 Rest 参数时,它会将传递给函数的所有参数都放到一个数组中,并将该数组作为 Rest 参数的值传递给函数。例如:

const myFunction = (...args) => {
  console.log(args);
};
myFunction(1, 2, 3); // Output: [1, 2, 3]

示例:

// 普通函数中的arguments
function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}
sum(1, 2, 3); // 6

// 箭头函数中的Rest参数
const sum = (...args) => {
  let total = 0;
  for (let i = 0; i < args.length; i++) {
    total += args[i];
  }
  return total;
};
sum(1, 2, 3); // 6

1.4 箭头函数不能用作构造函数

普通函数可以用作构造函数来创建对象,而箭头函数不能用作构造函数。

示例:

// 普通函数作为构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}
const tom = new Person('Tom', 18);

// 箭头函数不能作为构造函数
const Person = (name, age) => {
  this.name = name;
  this.age = age;
};
const tom = new Person('Tom', 18); // TypeError: Person is not a constructor

2 箭头函数和普通函数的适用场景

2.1 普通函数的适用场景

2.1.1 构造函数

当你需要创建一个对象的实例时,通常会使用构造函数。在构造函数中,this 关键字指向新创建的对象实例。

function Person(name) {
  this.name = name;
}

const john = new Person('John');
console.log(john.name); // Output: John

2.1.2 方法

如果你需要在对象上定义一个方法,并且需要访问该对象的属性或方法,则应使用普通函数。

const obj = {
  name: 'John',
  sayHello: function() {
    console.log(`Hello ${this.name}`);
  }
};

obj.sayHello(); // Output: Hello John

2.1.3 回调函数

如果你需要将一个函数作为回调函数传递给其他函数,通常应该使用普通函数。因为其他函数可能会更改该函数的上下文。

示例代码: setTimeout() 函数。

function myCallback() {
  console.log('Callback executed!');
}

setTimeout(myCallback, 5000); // Output: Callback executed!

在调用setTimeout()函数时,myCallback()函数并没有立即执行,而是在等待一段时间后才执行。因此,上面的示例代码应该是在等待5000毫秒后才会在控制台输出"Callback executed!"。

2.2 箭头函数的适用场景

箭头函数适用于那些简短、简洁、明确的函数,可以使代码更加简洁易懂。

2.2.1 简答的回调函数

当需要传递一个简单的函数作为回调,箭头函数可以使代码更简洁。

示例:

// 普通函数
arr.forEach(function(item) {
  console.log(item);
});

// 箭头函数
arr.forEach(item => console.log(item));

2.2.2 隐式返回

当函数只有一行代码并且返回一个值时,可以使用箭头函数来隐式返回该值,这可以使代码更加简洁。

// 普通函数
function square(x) {
  return x * x;
}

// 箭头函数
const square = x => x * x;

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

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

相关文章

IIS配置URL重写,http重定向https

文章目录 1️⃣ URL重写1.1 URL重写插件下载1.2 URL重写插件安装1.3 URL重写插件配置 优质资源分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/131004077 IIS配置URL重写&#xff0c;http重定向https&#xff0c;ht…

【计算机图形学】【代码复现】A-SDF中的数据集制作与数据生成

Follow A-SDF 的Data Generation部分&#xff1a; We follow (1) ANSCH to create URDF for shape2motion dataset (1-2) URDF2OBJ&#xff08;本人认为是1-2之间需要进行的重要的过渡部分&#xff09; (2) Manifold to create watertight meshes (3) and modified mesh_to_sdf…

CPLEX Studio 集成开发环境 (IDE) 介绍

CPLEX Studio 集成开发环境 (IDE) 介绍 参考B站视频&#xff1a;cplex入门到精通 1.CPLEX Studio IDE 实现的功能 IBM ILOG CPLEX Studio IDE 是一个用于数学规划、约束规划以及一般组合优化应用程序的集成开发环境。 它是适用于 OPL&#xff08;优化编程语言&#xff09;和…

PointNetGPD使用手册

1.创建环境配置环境变量 mkdir -p $HOME/code/ cd $HOME/code/ - Set environment variable PointNetGPD_FOLDER in your $HOME/.bashrc file. export PointNetGPD_FOLDER$HOME/code/PointNetGPD 2.安装 1. Install pcl-tools via sudo apt install pcl-tools. 2. An e…

在家当了几年废物,庆幸自己当初进了软件测试这行~

为什么会学习软件测试&#xff1f; 28岁了&#xff0c;仔细算一下6年了&#xff0c;工作了一年&#xff0c;没去工作就一直待在家&#xff0c;家里固定每个月给几千元&#xff0c;偶尔会都给一些&#xff0c;但依旧没钱&#xff0c;家里给我买了一套房子&#xff0c;出门300米…

【刷题之路Ⅱ】LeetCode 739. 每日温度

【刷题之路Ⅱ】LeetCode 739. 每日温度 一、题目描述二、解题1、方法1——暴力法1.1、思路分析1.2、代码实现 2、方法2——单调栈2.1、思路分析2.2、先将栈实现一下2.3、代码实现 一、题目描述 原题连接&#xff1a; 739. 每日温度 题目描述&#xff1a; 给定一个整数数组 tem…

ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发-1

ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发 基于LangChain的LLM应用程序开发 LangChain for LLM Application Development [https://www.deeplearning.ai/short-courses/langchain-for-llm-application-development/] 基于LangChain的LLM应用程序开发…

干货|SpringCloud之注册中心如何选用

SpringCloud的框架并不陌生了&#xff0c;在业内微服务领域的扛把子。今天来看一看如何根据业务需要&#xff0c;来选择合适的注册中心&#xff1f; 注册中心是微服务管理节点通信、核心配置的关键组件&#xff0c;从分布式多节点的前提下最主要要解决是就是分布式下的一致性问…

教你领取免费的亚马逊云服务服务器并搭建服务器环境的方法教程

本篇文章主要讲解&#xff0c;亚马逊新用户注册领取亚马逊免费服务器的详细操作流程方法,以及如何规避免费服务器到期后自动续费的问题解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年6月2日 前提材料准备 1.需要先准备好你的亚马逊账号注册所需的手机号、邮箱、vi…

18-Vue3中一些新的组件

目录 1、Fragment2、Teleport3、Suspense 1、Fragment 在Vue2中: 组件必须有一个根标签在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中好处: 减少标签层级, 减小内存占用 2、Teleport 什么是Teleport&#xff1f;—— Teleport 是一种能够将我…

一个开源的基于golang开发的企业级物联网平台

SagooIOT是一个基于golang开发的开源的企业级物联网基础开发平台。负责设备管理和协议数据管理&#xff0c;支持跨平台的物联网接入及管理方案&#xff0c;平台实现了物联网开发相关的基础功能&#xff0c;基于该功能可以快速的搭建起一整套的IOT相关的业务系统。旨在通过可复用…

测试4年,费时8个月,入职阿里,涨薪14K,可算是熬出头了····

前言 你的努力&#xff0c;终将成就无可替代的自己 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事功能测试&#xff08;所谓的点点点&#xff09;的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;…

java打jar包并包装成exe解压即用

1首先找到要加载的main方法类 public static void main(String[] args) { //创建该对象则调用构造方法&#xff0c;对象实现ActionListener则自动调用actionPerformed&#xff08;&#xff09;方法new PicdealMain();}2.点击 idea&#xff1a;File->Project Struce…(快捷键…

MyBatis深入学习总结(1.0)

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

3年经验,面试测试开发岗25K都拿不到了吗?这么坑?

最近后台读者说自己最近在疯狂投简历&#xff0c;有的石沉大海&#xff0c;但还好不是全军覆没。前两天好不容易熬到了阿里的四面&#xff0c;跟我聊了一下&#xff0c;面试官拿哪些题为难了他&#xff1f; 前面几题还好&#xff0c;问的是有关JVM的一些问题&#xff0c;比如说…

一道Java经典面试题 99%都有可能做错

前言 最近在面试中遇到一个关于位运算的题目 如下图 请问这个aString打印值是多少 学过位运算我们都知道 9<<4位 用2进制表示就是0000 1001 如果按照我之前的算法就是 0000 10001 向左位运算4 得到 1001 0000 这个时候我们得到的值就是 12816 144 拿到144这个值我们再…

session.upload_progress文件包含漏洞

session.upload_progress文件包含漏洞 前言 之前学习了该漏洞&#xff0c;但是没有做笔记&#xff0c;导致容易遗忘。在此用一个题目来理解session.upload_progress漏洞 基础知识 session存储 我们在phpinfo可以看到session的存储路径&#xff1a; 以下是一些session在lin…

【Python文本处理】基于运动路线记录GPX的文件解析,GPX转SRT字幕文件(不需要安装三方库)

【Python文本处理】基于运动路线记录GPX的文件解析&#xff0c;GPX转SRT字幕文件&#xff08;不需要安装三方库&#xff09; 解析和转换 GPX文件格式 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;t…

【GTest】使用CMakeLitsts.txt构建Windows和Linux的跨平台GoogleTest项目(非常详细+亲测有效)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

00): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

好久没有使用数据库&#xff0c; 连接数据库报上面的错误&#xff0c;尝试了网上的方法还是没有成功&#xff0c;思索之后想起之前手动关闭了mysql的服务&#xff0c;Windows启动时mysql服务不会自动启动&#xff0c;成功启动mysql服务后再次连接数据库&#xff0c;正常连接。 …