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

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

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

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]删除
最新教程 更多>
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-14
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-07-14
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-07-14
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 在使用Chrome and IE9中的图像时遇到的一个频繁的问题是围绕图像的持续薄薄边框,尽管指定了图像,尽管指定了;和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下...
    编程 发布于2025-07-14
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-07-14
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-07-14
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-07-14
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-14
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-07-14
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-07-14
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-07-14
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-07-14
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-07-14
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-07-14
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-14

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

Copyright© 2022 湘ICP备2022001581号-3