”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 掌握 JavaScript 函数:普通函数与箭头函数指南

掌握 JavaScript 函数:普通函数与箭头函数指南

发布于2024-11-08
浏览:229

Mastering JavaScript Functions: Your Guide to Normal vs. Arrow Functions

在 JavaScript 中,函数是该语言的基本构建块,允许开发人员定义可重用的代码块。 JavaScript 中两种主要的函数类型是普通函数和箭头函数。虽然它们乍一看似乎很相似,但它们在语法、行为和用例方面有明显的差异。本文将逐步深入探讨这些差异,提供详细的示例并涵盖所有场景,帮助您有效掌握普通函数和箭头函数之间的细微差别。

普通函数与箭头函数:探索分歧
句法
JavaScript 中的普通函数是使用 function 关键字定义的,后跟函数名称、参数(如果有)以及大括号内的函数体。这是一个例子:

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

另一方面,箭头函数提供了 ES6 中引入的更简洁的语法。它们使用箭头 (=>) 表示法,并省略 function 关键字和单行函数的大括号。例如:

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

词法绑定
普通函数和箭头函数之间最显着的区别之一是它们如何处理 this 关键字。在普通函数中,this 的值由函数的调用方式决定。相反,箭头函数不会绑定自己的 this ,而是从封闭范围继承它。让我们用一个例子来说明这一点:

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

person.sayHello(); // Output: Hello, John!

const personArrow = {
    name: 'Jane',
    sayHello: () => {
        console.log(`Hello, ${this.name}!`);
    }
};

personArrow.sayHello(); // Output: Hello, undefined!

在上面的示例中,person.sayHello() 正确记录“Hello, John!”因为 this 指的是 personobject。然而,personArrow.sayHello() 记录“Hello, undefined!”因为箭头函数没有自己的this绑定,导致它从未定义name的全局范围继承this值。

参数 对象
另一个区别在于arguments 对象。普通函数可以访问argumentsobject,它是一个类似数组的对象,包含传递给函数的所有参数。然而,箭头函数没有自己的arguments对象。让我们用 e
来说明这一点

xample:

function sum() {
    let total = 0;
    for (let i = 0; i  {
    let total = 0;
    for (let i = 0; i 



在上面的示例中,sum() 使用argumentsobject 正确计算了传递给它的所有参数的总和。但是,sumArrow() 会抛出 ReferenceError,因为箭头函数无法访问参数。

关键字
普通函数可以用作带有 new 关键字的构造函数来创建对象的新实例。但是,箭头函数不能用作构造函数。将箭头函数与 new 一起使用将导致类型错误。这是一个例子:

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

const john = new Person('John');
console.log(john.name); // Output: John
const PersonArrow = (name) => {
    this.name = name;
}

const jane = new PersonArrow('Jane'); // TypeError: PersonArrow is not a constructor

常见问题部分
问:什么时候应该使用普通函数而不是箭头函数?
答:当需要访问 this 关键字、参数对象或定义构造函数时,请使用普通函数。箭头函数更适合简洁的单行语句或当您想要维护词法作用域时。

问:箭头函数可以有名字吗?
答:不可以,箭头函数不能有名称。他们默认是匿名的。

问:箭头函数比普通函数更快吗?
答:箭头函数和普通函数没有显着的性能差异。它们之间的选择应该基于它们的具体用例和可读性。

问:我可以在对象方法中使用箭头函数吗?
A:是的,箭头函数可以在对象方法中使用,但是要小心,因为它们没有绑定自己的this,这可能会导致意外的行为。

结论
总之,虽然普通函数和箭头函数都用于在 JavaScript 中定义函数,但它们在语法、行为和用例方面有所不同。理解这些差异对于编写干净、高效且无错误的代码至关重要。通过考虑本文中概述的场景,您可以就何时在 JavaScript 项目中使用每种类型的函数做出明智的决定。

请记住,没有一刀切的解决方案,普通函数和箭头函数之间的选择最终取决于代码的具体要求和编码风格偏好。

版本声明 本文转载于:https://dev.to/kafeel_ahmad/mastering-javascript-functions-your-guide-to-normal-vs-arrow-functions-2onk?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-04-30
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-04-30
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-04-30
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-04-30
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-04-30
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-04-30
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-30
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-04-30
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-30
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-04-30
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-04-30
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-04-30
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-04-30
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-04-30
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-04-30

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3