常规函数和箭头函数之间的主要区别

news2025/2/3 3:05:37

常规函数和箭头函数之间的主要区别

JavaScript 中,函数是设计用于执行特定任务的代码块。函数允许使用函数将大型程序分解为多个更小、更易于管理的组件。因此,我们就不再需要重复编写相同的代码。

JavaScript中有两种类型的函数

  • 常规函数
  • 箭头函数( ES6中引入)

常规函数

我们可以通过两种方式编写常规函数,即函数声明函数表达式

// 函数声明
function add(a, b) {
  return a + b;
}

const sum = function (a, b) {
  return a + b;
};

add(1, 2);
sum(1, 2);

函数声明和函数表达式之间的主要区别是我们也可以在声明(具体可以查看这篇js 变量提升和函数提升)之前调用函数add(1,2) ,但是 函数sum(1,2)需要在定义之后调用。

箭头函数

箭头函数是 ES6 中引入的新特性,它是编写函数表达式的更简洁的语法。与常规函数相比,它允许我们更清晰地创建函数。它没有函数声明的方式,我们可以只使用函数表达式来编写。

// 箭头函数表达式
const add = (a, b) => {
  return a + b;
};

// 更简洁的方式
const add = (a, b) => a + b;

箭头函数和常规函数有一定的区别,即

  • 语法
  • arguments对象(arguments是类似数组的对象)
  • 箭头函数没有原型对象
  • 无法使用 new 关键字调用(不是构造函数)
  • 没有 this对象(callapplybind将无法按预期生效)
  • 它不能用作生成器函数
  • 不允许重复命名的参数

下面我们来逐个讲解

区别

语法

如果仅存在一个表达式,则不需要大括号,并且它将隐式从函数返回此结果。这使得代码更清晰。

const add = (a, b) => a + b;

const square = a => a * a;

无arguments

如果函数的参数数量未知,我们可以将所有参数作为单个变量获取,即arguments。参数对象看起来像这样:

function getAllParameters() {
  console.log(arguments);
}

getAllParameters(1, 'args', {a: 1}, true)

在这里插入图片描述

arguments是一个类似数组的对象。类数组对象和数组对象之间的相似之处在于它们都具有长度属性。不同的是,类数组对象没有数组的内置方法,但是我们可以使用Array.from将类数组对象转换为数组对象。

function getAllParameters() {
  console.log(arguments);
  console.log(Array.from(arguments));
}

在箭头函数中,没有任何参数,如果我们在箭头函数中访问参数,将会抛出类似Uncaught ReferenceError: arguments is not Defined 的错误。

const getAllParameters = () => {
  console.log(arguments);
}

getAllParameters(1, 'args', {a: 1}, true)

在这里插入图片描述

但我们可以使用剩余参数(...)来代替,它得到一个普通的数组对象。

const getAllParameters = (...args) => {
  console.log(args);
}

getAllParameters(1, 'args', {a: 1}, true)

在这里插入图片描述

箭头函数没有原型对象

箭头函数没有像常规函数那样的原型对象,如果尝试访问箭头函数的原型,它将返回undefined

function regular() {}

const arrayFn = () => {}

console.log(regular.prototype);
console.log(arrayFn.prototype);

在这里插入图片描述

无法使用 new 关键字调用

箭头函数不能用 new 关键字调用,因为箭头函数没有构造函数。如果尝试使用new关键字实例化,则会抛出错误。

const arrayFn = () => {}

const obj = new arrayFn();

在这里插入图片描述

没有this对象

在常规函数中,它的内部this值是动态的,它取决于函数如何被调用。例如:

function regular() {
  console.log(this);
}

const obj = {
  getThis: regular
}

regular();
obj.getThis();

在这里插入图片描述

与常规函数不同,箭头函数没有自己的this绑定。如果我们在箭头函数中访问this ,它将返回最近的非箭头父函数的this

const arrayFn = () => {
  console.log(this);
}

const obj = {
  getThis: arrayFn
}
arrayFn();
obj.getThis();

在这里插入图片描述

箭头函数中 this 的值在声明时确定,并且永远不会改变。所以call, apply,bind不能改变箭头函数的this

不能用作生成器函数

function* 语句(function关键字后跟星号)定义了一个生成器函数。

Yield 关键字不能用在箭头函数的主体中(除非在进一步嵌套的函数中允许使用)。因此,箭头函数不能用作生成器。

const arrayGenerator = *() => {}

在这里插入图片描述

不允许重复命名的参数

在非严格模式下,常规函数允许我们使用重复的命名参数。但在严格模式下,是不允许的。

function add(a, a) {
  return a + a;
}

function add(a, a) {
  console.log('replace');
  return a + a + 10;
}

add(1, 2)

在这里插入图片描述

"use strict"
function add(a, a) {
  return a + a;
}

function add(a, a) {
  console.log('replace');
  return a + a + 10;
}

add(1, 2)

在这里插入图片描述

与常规函数不同,箭头函数不允许重复参数,无论是在严格模式还是非严格模式。重复的参数将导致抛出语法错误。

const add = (a, a, a) => {
  console.log(a)
}

在这里插入图片描述

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

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

相关文章

jmeter如何进行web脚本录制

目录 录制web脚本 (1)jmeter中设置HTTP代理 (2)浏览器中设置代理 (3)页面操作 (4)查看录制的web脚本 (5)脚本内容过滤 (6)脚本优化…

练习 数列前n项和(递归函数)

C++自学精简教程 目录(必读) 数列的前n项和 S = 1 + 2 + 3 + ...... + n 之前我们用for循环求解数列前n项和,本文用递归函数求解。 代码如下 #include <iostream> using namespace std;int f(int a) {if (a == 1){return 1;}else{return a + f(a - 1);} }int main(…

APP外包开发中的H5框架

在开发APP的技术中&#xff0c;除了原生开发外也可以使用H5框架来开发。原生开发的特点是质量高&#xff0c;用户体验更好&#xff0c;但成本高&#xff0c;适用于对质量要求高的APP项目。H5框架的特点是通用性较强&#xff0c;对开发人员的要求相对较低&#xff0c;成本也低&a…

从小众到大热:海外网红营销的成功之道

在当今数字时代&#xff0c;社交媒体已经成为人们获取信息、沟通交流的主要渠道之一。而在这个社交媒体的浪潮中&#xff0c;海外网红营销逐渐从小众走向大热。它以其独特的营销模式和广泛的受众群体&#xff0c;成为许多品牌和企业的首选营销方式。本文Nox聚星将详细介绍海外网…

高等学校节能监控平台的具体应用 安科瑞 许敏

摘要&#xff1a;高校节能监控平台&#xff0c;主要是通过物联网技术实现对水、电、气等高耗能设备进行计量和控制&#xff0c;为高校能耗的分析&#xff0c;能源流向&#xff0c;节能目标提供有力的数据支撑。高效节能监控平台主要包括能耗监测系统、照明节能控制系统、空调节…

Gtest在ARM平台上的离线搭建(让Gtest编译安装成功之后的可执行文件.so变成ARM下的—ARM aarch64)(实用篇)

编译时自动调用Cunit或者Gtest的静态或者动态库文件说明拷贝Gtest安装包到新目录下根目录下创建build目录并且进行编译检查生成的库文件是否属于ARM架构下的将库文件拷贝到统一的ARM包下面编译时自动调用Cunit或者Gtest的静态或者动态库文件说明 这里之前在usr/local/lib下面安…

Springboot工程常见错误

1. mybatis的mapper.xml出现tag name expected错误 https://blog.csdn.net/watson2017/article/details/128902300 <符号在xml配置SQL 语句中是不能直接识别出来的&#xff0c;也就是说&#xff0c;我们在使用到 > 、< 等符号的时候&#xff0c;需要将其进行转义&…

LaTex 的基本使用方法

TeXstudio 设置新建和编辑文档编译和预览拼写检查宏和脚本 LaTex 分模块详解 LaTex 文件头 documentclass article&#xff1a;用于写短篇文章、报告report&#xff1a;用于写长篇报告、学位论文、技术报告等book&#xff1a;用于编写书籍&#xff0c;具有章节、子章节和节的…

leetcode 77. 组合

2023.7.17 今天正式开始回溯系列&#xff0c;这是一道经典回溯题。 先上一个经典回溯模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点…

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要

飞行动力学 - 第10节-空间机动性、稳定性与操纵性概述 之 基础点摘要 1. 协调盘旋性能计算流程2. 一般盘旋2.1 动力学方程2.2 角点速度2.3 典型战斗机盘旋曲线 3. 空间机动能力4. 飞行动力学&#xff1a;飞行性能稳定性与操纵性5. 稳定性定义6. 飞行品质6.1 品质等级6.2 品质评…

大数据测试之数据仓测试怎么做(上)

前面的文章我们为大家介绍了大数据测试平台和大数据系统的测试方法&#xff0c;接下来我们重点来讲一下数据仓库测试&#xff0c;首先看一下它的定义。 数据仓库(Data Warehouse)&#xff1a;一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的 &#xff08;In…

给学弟妹们的 10 个秋招建议!

大家好&#xff0c;我是鱼皮。最近很多大公司的提前批陆陆续续开启了&#xff0c;说明秋招已经拉开了序幕&#xff0c;大家要准备起来了。 所以我也赶紧写了一篇文章&#xff0c;结合自己曾经大厂求职的经验&#xff0c;并且从招聘方的角度&#xff0c;给学弟妹们一些秋招找工…

机器人架构设计和中间件

一&#xff0e;引言 在无人驾驶与机器人领域&#xff0c;算法一直都是研究的核心。无论是导航技术、控制技术&#xff0c;还是识别技术都是构成其技术栈的重要组成部分。但是&#xff0c;随着技术的发展&#xff0c;开发者们逐渐认识到一个问题&#xff0c;即程序本身的组织架构…

善用AI; AI生成美女图片中隐藏汉字,光影艺术引爆网络讨论

&#x1f989; AI新闻 &#x1f680; AI生成美女图片中隐藏汉字&#xff0c;光影艺术引爆网络讨论 摘要&#xff1a;近期&#xff0c;一组AI生成的美女图片在网络上疯传&#xff0c;用户发现这些图片中隐藏了汉字。这种光影艺术效果引起了广泛关注和讨论。AI绘画工具ControlN…

红外雨量计(光学雨量传感器)在小型气象站的应用

红外雨量计&#xff08;光学雨量传感器&#xff09;在小型气象站的应用 红外雨量计是一种常见的气象测量设备&#xff0c;也是小型气象站中一个重要的组成部分。随着现代科技的发展&#xff0c;红外雨量计逐渐取代了传统的测雨器&#xff0c;成为广大气象从业人员的首选设备。…

新建Proteus工程文件以及51单片机的最小系统的绘制和简单介绍

一、新建Proteus工程 1.创建一个新的文件夹存放工程 2.打开Proteus 8软件&#xff0c;界面如图所示 3.点击【新建工程】 4.填写工程名称&#xff0c;选择工程保存路径&#xff08;步骤1中创建的新文件夹&#xff09;后点击【Next】 5.选择【从选中的模板中创建原理图】,选择具体…

startqueue(模拟实现及底层原理)

目录 容器适配器 STL标准库中stack和queue的底层结构 ​deque deque的原理 deque的缺陷 为什么选择deque作为stack和queue的底层默认容器 stack stack的介绍 stack的函数 stack的模拟实现 queue queue的介绍 queue的函数 queue的模拟实现 priority_queue prior…

opencv基础09-图像运算之-加法运算(图像增强预处理)

opencv基础09-图像运算 什么是图像运算&#xff1f; 在图像处理过程中&#xff0c;经常需要对图像进行加法运算。可以通过加号运算符“”对图像进行加法运算&#xff0c;也可以通过 cv2.add()函数对图像进行加法运算。 通常情况下&#xff0c;在灰度图像中&#xff0c;像素用…

美颜滤镜SDK:打造个性化直播体验的关键工具

时下&#xff0c;美颜滤镜SDK则成为了打造个性化直播体验的关键工具。美颜滤镜SDK&#xff0c;顾名思义&#xff0c;就是一种可以为直播画面添加美颜效果的软件开发工具包。通过该SDK&#xff0c;用户可以在直播过程中使用各种美颜滤镜&#xff0c;让自己的肌肤更加细腻、光滑&…

云原生之深入解析K8S中Ceph的部署与功能测试

一、前言 Ceph 在 k8s 中用做共享存储还是非常方便的&#xff0c;Ceph 是比较老牌的分布式存储系统&#xff0c;非常成熟并且功能也强大&#xff0c;支持三种模式&#xff08;快存储、文件系统存储、对象存储&#xff09;&#xff0c;那么如何在 k8s 使用 ceph 呢&#xff1f;…