2022年了,你还没搞清楚箭头函数与普通函数的区别嘛?

news2024/12/23 9:14:40

目录

1.箭头函数简介

2.箭头函数与普通函数的区别

A.声明方式不同,匿名函数

B.this指向不同

C.箭头函数的this永远不会变,call、apply、bind也无法改变

D.箭头函数没有原型prototype

E.箭头函数不能当成一个构造函数

F.箭头函数没有自己的arguments


1.箭头函数简介

// 箭头函数
let foo = (name) => `我是${name}`
foo('风继续吹') // 我是风继续吹

// 等同于下面这个普通函数
let foo2 = function(name) {
    return `我是${name}`
}

箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }return

let foo = (name) => {
    if(name){
        return `我是${name}`
    }
    return '前端风继续吹'
}
foo('风继续吹') // 我是南玖

这里需要注意的是如果箭头函数返回的是一个字面量对象,则需要用括号包裹该字面量对象返回

let foo = (name) => ({
    name,
    job: 'front end'
})
// 等同于
let foo2 = function (name) {
  return {
    name,
    job: 'front end'
  }
}

2.箭头函数与普通函数的区别

我们可以通过打印箭头函数和普通函数来看看两者到底有什么区别:

let fn = name => {
    console.log(name)
}
let fn2 = function(name) {
    console.log(name)
}
console.dir(fn) // 
console.dir(fn2) // 

 从打印结果来看,箭头函数与普通函数相比,缺少了caller,arguments,prototype

A.声明方式不同,匿名函数

  • 声明一个普通函数需要使用关键字function来完成,并且使用function既可以声明成一个具名函数也可以声明成一个匿名函数
  • 声明一个箭头函数则只需要使用箭头就可以,无需使用关键字function,比普通函数声明更简洁。
  • 箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名

B.this指向不同

对于普通函数来说,内部的this指向函数运行时所在的对象,但是这一点对箭头函数不成立。它没有自己的this对象,内部的this就是定义时上层作用域中的this。也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。

var name = '风继续吹'
var person = {
    name: 'front end',
    say: function() {
        console.log('say:',this.name)
    },
    say2: () => {
        console.log('say2:',this.name)
    }
}
person.say() // say: front end
person.say2() // say2: 风继续吹

这里第一个say定义的是一个普通函数,并且它是作为对象person的方法来进行调用的,所以它的this指向的就是person,所以它应该会输出say: front end

而第二个say2定义的是一个箭头函数,我们知道箭头函数本身没有this,它的this永远指向它定义时所在的上层作用域,所以say2this应该指向的是全局window,所以它会输出say2: 风继续吹

C.箭头函数的this永远不会变,call、apply、bind也无法改变

我们可以用call、apply、bind来改变普通函数的this指向,但是由于箭头函数的this指向在它定义时就已经确定了,永远指向它定义时的上层作用域中的this,所以使用这些方法永远也改变不了箭头函数this的指向。

var name = '风继续吹'
var person = {
    name: 'nanjiu',
    say: function() {
        console.log('say:',this.name)
    },
    say2: () => {
        console.log('say2:',this.name)
    }
}

person.say.call({name:'小明'}) // say: 小明
person.say2.call({name:'小红'}) // say2: 风继续吹

还是上面那个例子,只不过我们在调用的时候使用call试图改变this指向,第一个say是一个普通函数,它经过call调用,打印出的是say: 小明,这说明普通函数的this已经改变了,第二个say2是一个箭头函数,它也经过call调用,但它打印出的仍然是say2: 风继续吹,这就能够证明箭头函数的this永远不会变,即使使用call、apply、bind也无法改变

D.箭头函数没有原型prototype

let fn = name => {
    console.log(name)
}
let fn2 = function(name) {
    console.log(name)
}
console.log(fn.prototype) // undefined
console.dir(fn2.prototype) // {constructor: ƒ}

在这里补充一下prototype的相关知识点 

E.箭头函数不能当成一个构造函数

为什么箭头函数不能当成一个构造函数呢?我们先来用new调用一下看看会发生什么:

let fn = name => {
    console.log(name)
}

const f = new fn('风继续吹')

报错:

 F.箭头函数没有自己的arguments

箭头函数处于全局作用域中,则没有arguments

let fn = name => {
    console.log(arguments)
}
let fn2 = function(name) {
    console.log(arguments)
}
fn2() // Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ]
fn()  // 报错 Uncaught ReferenceError: arguments is not defined

还是用这两个函数来比较,普通函数能够打印出arguments,箭头函数使用arguments则会报错,因为箭头函数自身是没有arguments的,然后它会往上层作用域中去查找arguments,由于全局作用域中并没有定义arguments,所以会报错。

可以使用rest参数代替arguments传入参数

ES6 引入 rest 参数,用于获取函数不定数量的参数数组,这个API是用来替代arguments的,形式为...变量名,rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

let fn3 = (a,...arr) => {
    console.log(a,arr) //1, [2,3,4,5,6]
}

fn3(1,2,3,4,5,6)

上面就是rest参数的基本用法,需要⚠️注意的是:

  • rest参数只能作为函数的最后一个参数
    // 报错
    function f(a, ...b, c) {
      // ...
    }

  • 函数的length属性,不包括rest参数

备注:本文大量参考稀土掘金博主前端南玖相关知识点,若侵权请联系作者删除

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

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

相关文章

javaSE(数据类型、运算、逻辑控制、方法)

1.初识Java JDK、JRE、JVM之间的关系? JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。 JRE(Java Runtime Environment):Java运行时环…

LeetCode 1775. 通过最少操作次数使数组的和相等 --双指针

通过最少操作次数使数组的和相等 中等 174 相关企业 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 …

Android9.0以上系统安装Edxposed

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、背景说明 Android9.0以前,Xposed框架可通过apk进行快速安装,github地址: GitHub - rovo89/Xpos…

CRACK:CAD Exchanger SDK 3.15.0/MAC/WIN/LINUX/Android

CAD Exchanger SDK用于读取、写入和可视化 3D CAD 文件的软件库 通过访问 CAD 和 BIM 数据,快速轻松地丰富您的 Web、服务器或桌面应用程序。Ω578867473 使用 CATIA、SOLIDWORKS、Creo、STEP、JT、IFC 以及来自 C、Python、C#、Java 和 JavaScript 的更多格式。 适…

人民日报强烈推荐的13本证书,含金量都很高!

人民日报每年都会推荐一些当代最具含金量的证书,并建议大学生在大学期间的时候着手准备,为毕业后的简历添加色彩。 本次,人民日报推荐的证书主要有下列13种: 01 CPA(注册会计师) 含金量:★★…

博客管理系统

大致思路 1. 引入的依赖 数据库 Maven Repository: mysql mysql-connector-java 5.1.47 (mvnrepository.com) <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mys…

centos7用容器搭建svn仓库和管理页面

文章目录安装docker拉取 svn 仓库管理镜像创建仓库使用仓库安装docker 安装 docker 服务 yum install -y docker 修改 docker 服务配置&#xff0c;添加镜像拉取加速路径 vim /etc/docker/daemon.json javascript {"registry-mirrors": ["http://f1361db2.m.da…

【网页期末作业】基于HTML学校教育网页项目的设计与实现

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

更自动化的开发----给开发插上恣意飞翔的翅膀!

总结&#xff1a; 设置启动项&#xff1a;开机时候快速启动自己所需要的程序&#xff0c;根据程序数量不一样&#xff0c;每天节省可重复的劳动时间约为5s-1min(此处数据为自己瞎说 O(∩_∩)O哈哈~)&#xff1b; 使用生成代码的插件&#xff1a;开发使用easycode的插件&#…

m基于多D2D通信对和多蜂窝用户的LTE预编码技术matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 LTE网络中采用MIMO技术增加系统容量&#xff0c;提升吞吐率&#xff0c;从理论上来看,多天线的空分复用能成倍增加系统容量。但实际上并非如此,如&#xff0c;22MIMO的容量C&#xff08;容量&…

深度学习实验3 - 卷积神经网络

文章目录实验要求数据集定义1 手写二维卷积1.1 自定义卷积通道1.2 自定义卷积层1.3 添加卷积层导模块中1.4 定义超参数1.5 初始化模型、损失函数、优化器1.6 定义模型训练和测试函数&#xff0c;输出训练集和测试集的损失和精确度1.7 训练1.8 loss及acc可视化2 torch.nn 实现二…

一文打通ER图(手把手教你画)

期末了&#xff0c;E-R图也是大学课程设计中经常用到的&#xff0c;也是期末考的重点&#xff0c;毕竟大学生也没什么好考的&#xff0c;最近也有不少同学问&#xff0c;不少单子也扯到E-R图&#xff0c;但是我看了看网上的玩意好像没到手把手的地步&#xff0c;那么我就写一个…

Java面试题总结-ArrayList和LinkedList的区别

ArrayList和LinkedList都实现了List接口&#xff0c;并且两者都不是线程安全的。他们有以下的区别&#xff1a; &#xff08;1&#xff09;首先&#xff0c;最最本质的区别是&#xff1a;ArrayList内部使用的是动态数组来存储元素&#xff0c;而LinkedList内部使用的是双向链表…

PS图层+移动工具(3)对齐方式 对齐参照调整

此文为续文 请先查看 PS图层移动工具(2)复制删除快捷键 图层分组 前景色填充 后再查看本文 我们先来多选几个图层 然后上方属性栏 就激活了对应的操作 我们先来一波 左对齐 然后 就左对齐了 值得一提的是 这个左对齐 不是在屏幕的最左侧对齐 而是针对 所有你当前选择的图片…

华为机试 - 查找二叉树节点

题目描述 已知树形结构的所有节点信息,现要求根据输入坐标(x,y)找到该节点保存的内容值,其中x表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依次类推;y表示节点在该层内的相对偏移,从左至右,第一个节点偏移0,第二个节点偏移1,依次类推; 举例:上…

mysql索引失效

一、索引失效 1.当or左右查询字段只有一个是索引&#xff0c;该索引失效&#xff0c;只有当or左右查询字段均为索引时&#xff0c;才会生效 2.使用order by对数据库进行查询时&#xff0c;导致索引失效 &#xff0c;order by走全表扫描比回表的时间更少 3.主键和唯一索引在同…

算法刷题入门数据结构|二分查找

一.二分查找基础 1、二分查找介绍 二分查找(Binary search)也称折半查找&#xff0c;是一种效率较高的查找方法&#xff0c;时间复杂度。当对查数题目有时间复杂度要求是&#xff0c;首先就要考虑到二分查找。二分查找的思想很简单&#xff0c;属于分治策略的变种情况。但是&am…

贷后催收评分模型中的数据清洗与数据治理细节介绍

数据清洗是一个非常修炼身心的过程&#xff0c;途中你除了需要把所有的数据整业务合到一张宽表里。而这种宽表中所有的字段&#xff0c;是你理解完业务后&#xff0c;细心整理出来的所有适合建模的数据。 今天我们给大家介绍一下&#xff0c;在风控贷后评分模型中&#xff0c;…

C规范编辑笔记(七)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) 正文&#xff1a; 大家好&#xff0c;今天来分享一下C语言规范编辑笔记的第七篇&#xff0c;分享这个是希望自己后面忘记了可以去复习…

ADI Blackfin DSP处理器-BF533的开发详解26:扩展IO输入的详细讲解(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 ADSP-EDU-BF53x 开发板上扩展接口的 PORT2 和 PORT3 中引出了 6 个扩展 IO 接口输入接口&#xff0c;这些连接到了CPLD…