普通函数和箭头函数的区别

普通函数和箭头函数在JavaScript中主要有以下区别:

  1. 语法形式。箭头函数使用简洁的箭头语法=>定义,不需要像普通函数那样使用function关键字。
  2. 匿名性。箭头函数只能是匿名的,而普通函数可以是匿名的,也可以具有具体的名称。
  3. this指向。箭头函数的this值是在定义函数时确定的,而不是在函数被调用时。如果箭头函数在定义时处于某个上下文中,它会捕获该上下文的this值。一旦捕获,this值保持不变,即使使用call、apply或bind方法也无法改变。普通函数的this值则是在函数被调用时根据上下文确定的。
  4. 构造函数使用。箭头函数不能用作构造函数,不能通过new关键字实例化对象。普通函数可以用作构造函数,通过new关键字创建对象的实例。
  5. arguments对象和prototype属性。箭头函数没有自己的arguments对象和prototype属性,这意味着它们不能使用arguments对象来访问传递的参数,也不能作为其他函数的父类。普通函数有arguments对象来存储实际传递的参数,并且可以有prototype属性。

 一、普通函数使用 arguments 和 prototype

普通函数使用 arguments 对象:

// 定义一个普通函数
function sum() {let total = 0;for (let i = 0; i < arguments.length; i++) {total += arguments[i];}return total;
}// 调用函数并传入参数
console.log(sum(1, 2, 3, 4)); // 输出:10

在这个示例中,sum 函数没有明确指定参数列表,可以通过 arguments 对象获取所有传入的参数,并对它们进行求和操作。 

普通函数使用 prototype 属性:

// 创建一个构造函数
function Person(name) {this.name = name;
}// 通过 prototype 属性添加方法
Person.prototype.sayHello = function() {console.log("Hello, my name is " + this.name);
};// 创建一个实例对象
let person1 = new Person('Alice');// 调用实例方法
person1.sayHello(); // 输出:Hello, my name is Alice

在这个示例中,我们定义了一个 Person 构造函数,并通过 prototype 属性添加了一个 sayHello 方法。然后创建了一个 person1 实例对象,并调用了该实例对象上的 sayHello 方法,从而输出相应的问候语句。这种方式能够使方法被共享,节省内存空间。 

二、关于箭头函数this指向的详细解读:

箭头函数的 this 指向比较特殊,它总是指向其最近的外层函数作用域的 this 所指对象

箭头函数为以下形式的函数

const func = (paramList) => {// 函数体
}

按照习惯,将箭头函数作为单独一个函数来使用的情况并不多,往往是当要传入的参数是函数时才使用箭头函数

// 比如事件处理函数
elem.addEventListener("click", () => {// 函数体
})

this在函数中的指向

我们常用函数关键字function来声明一个函数,在一个function()中,this总是指向调用这个函数的对象。但箭头函数的this指向有点特别,它总是指向最近的外层作用域中的this所指对象

下面用例子来说明:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><button class="func">使用function构建事件处理函数</button><br /><br /><br /><button class="arrow">使用箭头函数构建事件处理函数</button><script>// 这里有两个点击事件,一个绑定的事件处理函数为普通函数,一个为箭头函数const func = document.getElementsByClassName('func')[0]const arrow = document.getElementsByClassName('arrow')[0]func.addEventListener("click", function () {console.log(this);});arrow.addEventListener("click", () => {console.log(this);});</script>
</body></html>

效果图如下:

由控制台打印结果可以看到:

普通函数构造的事件处理函数的this指向的是事件源对象(button

箭头函数构造的事件处理函数中的this指向的是其最近外层函数作用域中的this指向的Window对象(这个时候箭头函数的最外层函数是JavaScript环境)

 再看一个例子:

const obj = {func1() {setTimeout(function() {console.log(this);})},func2() {setTimeout(() => {console.log(this);})}
}
obj.func1(); // 打印出 Window
obj.func2(); // 打印出 当前对象obj

效果图如下:

这一次function构造的函数中的this指向了调用它的window对象,而箭头函数中的this指向了最近的外层函数作用域中的this指向的对象obj。

使用场景。箭头函数适用于简单的、不需要关心this上下文或原型继承的场景,如回调函数、数组方法(map、filter等)。普通函数适用于更复杂的场景,如定义对象的方法、构造函数等。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】1.从C语言转向C++

目录 一.对C的认识 二.C的关键字 三.命名空间 3.1命名空间的定义 3.2命名空间的使用 四.C的输入与输出 五.缺省参数 5.1全缺省参数 5.2半缺省参数 六.函数重载 七.引用 7.1引用的特性 7.2引用和指针的区别 八.内联函数 九.auto关键字&#xff08;C1…

LLMs之ToolAlpaca:ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略

LLMs之ToolAlpaca&#xff1a;ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略 目录 ToolAlpaca的简介 0、《ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases》翻译与解读 1、数据集列表 2…

openGauss_5.0.1 企业版安装及问题记录(CentOS系统):主备模式服务器安装

目录 &#x1f4da;第一章 官方地址&#x1f4d7;安装包下载地址&#x1f4d7;文档指南 &#x1f4da;第二章 安装&#x1f4d7;准备工作&#x1f4d7;开始安装&#x1f4d5;创建XML配置文件&#x1f4d5;初始化安装环境&#x1f4d5;执行安装&#x1f4d5;验证 &#x1f4da;第…

【算法刷题 | 回溯思想 01】4.11(回溯算法理论、组合、组合总和 ||| )

文章目录 回溯1.回溯算法理论基础1.1什么是回溯法&#xff1f;1.2回溯法的效率1.3回溯法解决的问题1.4如何理解回溯法&#xff1f;1.5回溯法模板 2.组合2.1问题2.2解法一&#xff1a;暴力解法&#xff08;循环次数不确定&#xff09;2.3解法二&#xff1a;回溯2.3.1回溯思路&am…

《web应用技术》第三次课后练习

实验目的&#xff1a; 1、springboot入门程序撰写并启动 2、使用postman练习参数的获取。 参考&#xff1a;Day04-10. Web入门-SpringBootWeb-快速入门_哔哩哔哩_bilibili

海外媒体发稿:新加坡 Asia One VS新加坡sg雅虎

海外媒体发稿&#xff1a;新加坡 Asia One VS新加坡sg雅虎 新加坡&#xff1a;雅虎 官网&#xff1a;sy.yahoo.com 官网&#xff1a;asiaone.com/lite 亚洲第一站。是 新加坡的新闻和生活方式网站和新闻聚合器。它是 新加坡第一个纯数字 内容平台&#xff0c;主要为新加坡、…

【C++学习】C++11新特性(第三节)——可变参数模板, lambda表达式与function包装器

文章目录 ♫文章前言♫一.可变参数模板♫1.什么是可变参数模板♫2.获取可变参数模板里参数包的方法♫3.可变参数模板在容器中的引用 ♫二. lambda表达式1. lambda表达式的由来♫2. lambda表达式♫1.lambda表达式语法♫2. 捕获列表说明 ♫3.函数对象与lambda表达式 ♫三.包装器♫…

智慧安防系统EasyCVR视频汇聚平台接入大华设备无法语音对讲的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xff0c;视频画面1、4、9、16个可选&#xff0c;支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标…

Python爬虫怎么挣钱?6个Python爬虫赚钱方式,搞搞副业不是问题

1.最典型的就是找爬虫外包活儿 网络爬虫最通常的的挣钱方式通过外包网站&#xff0c;做中小规模的爬虫项目&#xff0c;向甲方提供数据抓取&#xff0c;数据结构化&#xff0c;数据清洗等服务。新入行的程序员大多都会先尝试这个方向&#xff0c;直接靠技术手段挣钱&#xff0…

【数据库】GROUP BY 详解、示例、注意事项

一、基本介绍 GROUP BY 语句在 SQL 中用于将来自数据库表的记录分组&#xff0c;以便可以对每个组执行聚合函数&#xff08;如 COUNT(), MAX(), MIN(), SUM(), AVG() 等&#xff09;。使用 GROUP BY 时&#xff0c;数据库会根据一个或多个列的值将结果集分为多个分组&#xff…

【Linux学习】初识Linux指令(一)

文章目录 1.指令操作与图形化界面操作1.什么是指令操作&#xff0c;什么是图形化界面操作&#xff1f; 2.Linux下基本指令1.Linux下的复制粘贴2.Linux两个who命令3.补充知识4.pwd指令5. ls 指令6.cd 指令1.目录树2.相对路径与绝对路劲3.常用cd指令 7.tree指令8. touch指令9.sta…

产品经理常用UML图之「用例图」,附7张优质实例图!

用例图是产品经理应该会画的图之一&#xff0c;它是需求分析的产物&#xff0c;借助用例图&#xff0c;参与者以可视化的方式对问题进行探讨&#xff0c;能够减少大量沟通上的障碍。接下来&#xff0c;我们一起探讨和学习一下产品经理常用的UML用例图。 一、用例图简介 用例图…

数据可视化高级技术Echarts(折线图)

目录 一、什么是折线图 二、如何实现 1.基本折线图 2.如何变得平滑只需要定义&#xff1a; smooth 3.如何定义线条的样式 color&#xff1a;设置线的颜色 width&#xff1a;设置线宽 type&#xff1a;设置线的类型 4.如何定义节点样式 symbol symbolSize&#xff1a…

2024年【T电梯修理】考试总结及T电梯修理考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练&#xff01;安全生产模拟考试一点通每个月更新T电梯修理考试技巧题目及答案&#xff01;多做几遍&#xff0c;其实通过T电梯修理试题及解析很简单。 1、【多选题】修理工陶、陈&#xff0c…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文)&#xff0c;并且我想要切换语言时&#xff0c;页面语言环境会随之改变&#xff0c;目前发现&#xff0c;只能在vue中使用$t(‘’)的方式使用&#xff0c;但是这种方式只能在vue中使用&#xff0c;而我的菜单文件是定义在js中&#xff0c;…

neo4j使用详解(十六、集成Kerberos认证(Java/c#)——最全参考)

Neo4j系列导航&#xff1a; neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 1.简介 Kerberos是一种网络身份验证协议&#xff0c;它允许网络节点在网络上证明其身份。它通过使用密钥分发中…

企业如何使用SNP Glue将SAP与Snowflake集成?

SNP Glue是SNP的集成技术&#xff0c;适用于任何云平台。它最初是围绕SAP和Hadoop构建的&#xff0c;现在已经发展为一个集成平台&#xff0c;虽然它仍然非常专注SAP&#xff0c;但可以将几乎任何数据源与任何数据目标集成。 我们客户非常感兴趣的数据目标之一是Snowflake。Sno…

uniapp 小程序获取WiFi列表

<template><view ><button click"getWifiList">获取WiFi列表</button><scroll-view:scroll-top"scrollTop"scroll-yclass"content-pop"><viewclass"itemInfo"v-for"(item, index) in wifiList&…

21. 【Android教程】评分条 RatingBar

本节将继续学习一个和进度有关的控件&#xff1a;RatingBar &#xff0c;在 Android 中 RatingBar 是一个可以支持用户打分的 UI 控件&#xff0c;相比 ProgressBar 而言&#xff0c;RatingBar 不仅仅可以用来展示同时还可以接收用户的输入操作&#xff1b;而相比 SeekBar&…

【Java面试题】MySQL上篇(索引)

文章目录 索引1.索引的分类&#xff1f;2.B树和B树的区别&#xff1f;2.1B树2.2B树 3.为什么使用索引会加快查询&#xff1f;4.创建索引的注意点&#xff1f;5.索引在哪些情况下会失效&#xff1f;6.聚簇索引和非聚簇索引的区别&#xff1f;7.回表查询是什么&#xff1f;8.什么…