JavaScript普通函数与箭头函数有怎样的区别?

news2024/10/6 18:29:56

比较点

普通函数

箭头函数

具体案例

简写

/

箭头函数如果没有参数,同时函数体的返回值只有一句,则{}和return都可以省略。

1、函数简写

this指向

this总是指向调用它的对象,如果作为构造函数,它指向创建的对象实例

箭头函数的this指向的是父级作用域的this,是通过查找作用域链来确定 this 的值,也就是说看的是上下文的this,指向的是定义它的对象,而不是使用时所在的对象。

2、this指向

this改变

call()、apply()、bind()等方法能改函数中this的指向

call()、apply()、bind()等方法不能改变箭头函数中this的指向

3、改变this指向

构造函数

可以作为构造函数,用来创建对象实例

箭头函数不能作为构造函数使用

4、构造函数

arguments对象

每一个普通函数调用后都具有一个arguments对象,用来存储实际传递的参数。

箭头函数没有自己的arguments,取而代之用rest(剩余)参数...arg来解决

5、arguments与...args

prototype原型

具有prototype

没有prototype原型

6、prototype原型

1、箭头函数简写:

  • 箭头函数如果没有参数,同时函数体的返回值只有一句,则{}和return都可以省略
var fn = () => console.log("123");//去掉了{} 和 return
fn(); //'123'

2、this指向:

  • 普通函数中this指向的是调用它的对象,如果作为构造函数,它指向创建的对象实例
  • 箭头函数不会创建自己的this, 所以它没有自己的this,它只会在自己作用域的上一层继承this。所以箭头函数中this的指向在它在定义时已经确定了,之后不会改变。

普通函数中this指向的9大场景:

函数的调用方式

this指向

对象.函数( )

对象

函数( )

window

IIFE 立即执行函数

window

定时器

window

DOM事件处理函数

添加事件监听的元素

数组[下标 ]( )

数组

call(对象,arg1,arg2)

对象

apply(对象,arry)

对象

new 函数()

对象的实例

9大场景对应的案例代码,太多放不下,需要粉丝群获取。

箭头函数中this指向

箭头函数不会创建自己的this, 所以它没有自己的this,它只会在自己作用域的上一层继承this。所以箭头函数中this的指向在它在定义时已经确定了,之后不会改变。

<div id="box"></div>
<script>
   var fn = () => console.log(this); //window
   //var fn=function(){console.log(this);} // <div id="box"></div>
   document.getElementById("box").onclick = fn;
</script>

如果fn是普通函数,则this指向的是#box,如果是箭头函数,则this指向的是window

3、改变this指向

  • 普通函数通过调用call()、apply()、bind()可以改变this指向。
  • 箭头函数无法通过调用call()、apply()、bind()改变this指向。

普通函数

<script>
   const obj = {};
   function fn() {
       console.log(this);
  }
   fn(); //window
   fn.apply(obj); //obj  
   fn.call(obj); //obj
   fn.bind(obj)(); //obj
</script>

箭头函数

<script>
   const obj = {};
   const fn = () => console.log(this);
   fn(); //window
   fn.apply(obj); //window
   fn.call(obj); //window
   fn.bind(obj)(); //window
</script>

4、构造函数

  • 普通函数可以作为构造函数来创建对象实例
  • 箭头函数不能作为构造函数来使用,因为箭头函数没有自己的this

普通函数-用作构造函数

<script>
   function Person(name) {
       this.name = name;
  }
   const p = new Person("张三");
   console.log(p); //{name: '张三'}
</script>

箭头函数-用作构造函数会报错

<script>
   const fn = (a) => {
       console.log(a);
  };
   fn(1); //1
   console.log(new fn(1)); //Uncaught TypeError: fn is not a constructor
</script>

5、arguments与...args

  • 每一个普通函数调用后都具有一个arguments对象,用来存储实际传递的参数。
  • 箭头函数中访问arguments如果存在,则是来自于他的外层普通函数的arguments
  • 箭头函数没有自己的arguments对象,取而代之用rest(剩余)参数...args解决

普通函数中arguments

function sum(a) {
   console.log(arguments);
   console.log(arguments[0]);
}
sum(1, 2, 3);
//Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
//1  

箭头函数没有arguments对象

const sum = () => console.log(arguments);//arguments未定义
sum(); //Uncaught ReferenceError: arguments is not defined
  • 箭头函数中访问arguments如果存在,则是来自于他的外层普通函数的arguments
function a() {
   var b = () => console.log(arguments);//arguments是a函数中的
   b();
}
a(1, 2, 3); //Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]

箭头函数中 ...args剩余参数

const sum = (a, ...args) => console.log(args);
sum(1, "a", "b", 3); // ['a', 'b', 3]

arguments包含实际传递的所有参数,...args是剩余参数,只能放在所有参数后,并且不包含剩余参数前的参数。以下是错误写法

const sum = (a, ...args,b) => console.log(args);

6、prototype原型

  • 普通函数具有prototype原型属性
  • 箭头函数没有prototype原型属性
<script>
   //箭头函数
   var a = () => 1;
   //普通函数
   function b() {
       return 2;
  }
   console.log(a.prototype); // undefined
   console.log(b.prototype); // {constructor: ƒ}
</script>

学习更多的JavaScript

如果你正在学习JS或者已经在我们的三十天计划中完成了4个综合项目实战,那不妨可以听下这个课程体系,三十天计划群里还提供了算法、数组等知识体系!

前端工程师成长方法

更多完整JavaScript课程体系在我们的系统班你有完整的呈现,包含了JavaScript基础篇、重点、算法、原理、面试题、实战案例讲解!同时也为你提供了前端高级工程师成长体系!(详细看下图内容)

如果需要深度学习的同学可以练习助理老师了解详细的课程以及课程的报名方式!(不定期会推出活动,有大额优惠券推出,活动详情联系助理老师了解即可!)如果你才开始学习前端,那么可以先学习我们的三十天计划(零基础的同学报名系统班同学可以和老师沟通制定学习计划,可以得到更快的成长!)

为帮助到一部分同学不走弯路,真正达到一线互联网大厂前端项目研发要求,首次实力宠粉,打造了《30天挑战学习计划》,内容如下:

HTML/HTML5,CSS/CSS3,JavaScript,真实企业项目开发,云服务器部署上线,从入门到精通

  • PC端项目开发(1个)
  • 移动WebApp开发(2个)
  • 多端响应式开发(1个)

共4大完整的项目开发 !一行一行代码带领实践开发,实际企业开发怎么做我们就是怎么做。从学习一开始就进入工作状态,省得浪费时间。

从学习一开始就同步使用 Git 进行项目代码的版本的管理,Markdown 记录学习笔记,包括真实大厂项目的开发标准和设计规范,命名规范,项目代码规范,SEO优化规范

从蓝湖UI设计稿 到 PC端,移动端,多端响应式开发项目开发

  • 真机调试,云服务部署上线;
  • Linux环境下 的 Nginx 部署,Nginx 性能优化;
  • Gzip 压缩,HTTPS 加密协议,域名服务器备案,解析;
  • 企业项目域名跳转的终极解决方案,多网站、多系统部署;
  • 使用 使用 Git 在线项目部署;

这些内容在《30天挑战学习计划》中每一个细节都有讲到,包含视频+图文教程+项目资料素材等。只为实力宠粉,真正一次掌握企业项目开发必备技能,不走弯路 !

过程中【不涉及】任何费用和利益,非诚勿扰 。

如果你没有添加助理老师微信,可以添加下方微信,说明要参加30天挑战学习计划,来自公众号!老师会邀请你进入学习,并给你发放相关资料。

30 天挑战学习计划 Web 前端从入门到实战 | arry老师的博客-艾编程

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

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

相关文章

【MySQL】深入理解数据库事务

文章目录优秀借鉴1、事务由来2、何为ACID2.1、Atomicity原子性2.2、Consistency一致性2.3、Isolation隔离性2.4、Durability持久性3、聊回事务3.1、概念3.2、语法3.2.1、开启事务3.2.2、提交事务3.2.3、回滚事务4、隔离级别4.1、引入4.2、并发问题4.2.1、脏读4.2.2、不可重复读…

Spring Cloud alibaba 使用Nacos配置中心

依赖管理 Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本 请将下面的 BOM 添加到 pom.xml 中的 部分。 这将允许我们省略任何Maven依赖项的版本&#xff0c;而是将版本控制委派给BOM。 <dependencyManagement><dependencies><dependency><gr…

2022年底了,你们公司还好吗?我这里不太好

以下这些也是和几个朋友聊天的时候慢慢聊出来的&#xff0c;不一定真实啊&#xff0c;当做大家开发累了以后的一点调味剂吧 一、宇宙厂 1.宇宙人员成本优化计划&#xff0c;随着各个业务确认了优化目标&#xff0c;将在接下来陆续开展。 某中台确认了指标&#xff0c;将在“在职…

力扣刷题记录——121买卖股票的最佳时机 和125. 验证回文串

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《121.买卖股票的最佳时机和125. 验证回文串》。 目录 12…

QT学习 控件(一):按钮类

文章目录Qt控件&#xff1a;按钮QPushButtonQToolButtonQCommandLinkButtonQRadioButtonQCheckBoxQButtonGroupQt控件&#xff1a;按钮 QAbstractButton的信号&#xff1a; void clicked(bool checked false) &#xff1a; 是否选中按钮void pressed()&#xff1a; 点击按钮v…

嵌入式C语言面向对象编程 --- 继承

上一篇文章主要讲述了 C 语言面向对象编程 – 封装的简单概念和实现,本篇文章继续来讨论一下,如何使用 C 语言实现面向对象编程的另一个重要特性:继承。 继承就是基于一个已有的类(一般称作父类或基类),再去重新声明或创建一个新的类,这个类可以称为子类或派生类。子类…

ES文件浏览器 如何提取盒子已安装(内置)软件APK 教程

ES文件浏览器( ES File Explorer)是一款功能强大免费的本地和网络文件管理器。 主要功能&#xff1a;文件管理&#xff1a;多种视图列表和排序方式&#xff0c;查看并打开各类文件&#xff0c;在本地SD卡、局域网、OTG设备之间任意传输文件。多选、复制、粘帖、剪贴板、查看属性…

海豚dolphinscheduler 通过shell 调用.sql文件 传参

1. 准备sql文件 1.1 资源中心--创建文件 1.2 文件格式选择 sql, 文件内容 填要执行的sql内容 1.3 点击创建保存 2.shell调用.sql文件 2.1 拖拽一个shell 节点 2.2 编辑shell节点 hive -e&#xff1a;后面跟hivesql字符串 例如&#xff1a;hive -e "select * from studen…

【十天成为红帽工程师】第七天 Ansible的模块使用

目录 一、ansible的配置文件和清单文件 二、ansible的模块 三、实际操作命令 一、ansible的配置文件和清单文件 &#xff08;一&#xff09;看ansible的配置文件 1、命令&#xff1a;ansible --version 2、一般的配置文件是&#xff1a;/etc/ansible/ansible.cfg PS&am…

查看磁盘分区

在Window上查看磁盘分区&#xff0c;既可以使用diskpart list vol命令&#xff0c;也可以使用diskmgmt.msc命令&#xff0c;下面分别介绍这2种命令查看方式。 1、diskpart方式 按WinR --> 输入: cmd --> diskpart --> list vol&#xff0c;如下图所示: ## 按WinR, …

借助 Material Design,帮助您打造更好的无障碍应用 (中篇)

随着时代的发展&#xff0c;"无障碍体验" 对开发者的意义也愈发重大&#xff0c;在上一篇文章中&#xff0c;我们为您介绍了辅助技术&#xff0c;层次结构&#xff0c;颜色和对比度等内容。本文将进一步为您介绍无障碍布局和排版、文案等相关的内容。布局和排版Mater…

【Java面经】一次颇为进阶的面试记录

工作之余又参加了一次面试&#xff0c;对我来说比之前的面试难度都提了一个度&#xff0c;面试官从公司场景引申聊到高并发和Redis的很多问题。 可惜我太菜了回答不上来&#xff0c;只能回答基础的问题。面完就是凉凉的味道。。 Redis相关 Redis的String是怎么实现的&#xff…

盘点项目管理工具DHTMLX Gantt 的常见问题

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

vue中集成省市区街四级地址组件

大家好&#xff0c;我是雄雄。 前言 省市区地址大家应该都不陌生吧&#xff0c;网上买个东西&#xff0c;得填地址。中午定个饭&#xff0c;得写地址&#xff1b;叫个货拉拉叫个跑腿&#xff0c;是不是也得写地址。 但是选择地址的时候&#xff0c;不同场景下选择的范围不同&…

【C分支与循环】详解分支与循环

分支与循环前言一、什么是语句&#xff1f;二、分支语句&#xff08;选择结构&#xff09;&#xff08;一&#xff09;概念&#xff08;二&#xff09;if语句1.概念2.例子&#xff08;1&#xff09;单分支&#xff08;2&#xff09;双分支&#xff08;3&#xff09;多分支&…

vulnhub DC系列 DC-1

目录 下载地址 漏洞分析 信息收集 漏洞尝试 漏洞利用 flag1 flag2 flag3 flag4 提权 下载地址 DC-1.zip (Size: 733 MB)Download: http://www.five86.com/downloads/DC-1.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-1.zip使用方式:ova文件直接使用vm…

nacos安装与使用

nacos安装与使用nacos下载安装下载方式 一&#xff1a;下载方式 二&#xff1a;版本&#xff08;2.0.3&#xff09;nacos启动在项目中注册nacos服务nacos下载安装 下载方式 一&#xff1a; nacos官网下载 下载方式 二&#xff1a;版本&#xff08;2.0.3&#xff09; 链接&a…

【Flask框架】——28 Flask_SQLAlchemy

Flask-SQLAlchemy Flask-SQLAlchemy的使用对SQLAlchemy进行了封装和优化&#xff1a; Flask-SQLAlchemy是Flask框架的一个插件&#xff1b; Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件&#xff0c;使得我们在Flask中使用sqlalchemy更加的简单。 1.安装…

排查wx.previewImage真机预览一直loading问题

起因 使用van-uploader预览图片一直loading预览不了&#xff0c;开发者工具&#xff0c;浏览器都是秒开的。我看源码是使用wx.previewImage&#xff0c;自己写了个demo也是同样问题。 排查原因 链接是否拼接错误域名有没有添加进白名单防盗链referrer证书是否过期&#xff0…

企业数字化转型蓝图规划、生态体系建设、数字化管理平台建设方案

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 数字化助力上下…