学习笔记 JavaScript ES6 箭头函数

2023-10-28

学习内容:

  1. this指向定义时所在的对象,而不是调用时所在的对象
  2. 不可以当作构造函数
  3. 不可以使用arguments对象

1、this指向定义时所在的对象,而不是调用时所在的对象

先来回顾一下ES5当中如何定义函数:

function sum(x, y) {
    return x + y
}

console.log(sum(1, 2))

----
3

还有一种形式,把函数赋值给一个变量:

let sum = function(x, y) {
    return x + y
}

console.log(sum(1, 2))

----
3

以上两种方式的区别是,第一种定义函数的方法中,sum函数会被预定义,也就是说,无论是先定义再调用,还是先调用再定义都不会报错;第二种方法let定义的函数,只能先定义再调用,因为let不存在变量提升。

注意:src下面的代码会被webpack打包编译报错信息不明显,但如果放到static目录下就直接报错了,提示sum没有被定义

下面是箭头函数的写法(箭头函数左边是参数,右边是函数体)

  1. 首先箭头函数不需要写function关键字
  2. 然后在参数和函数体之间加一个等号大括号=>
let sum = (x, y) => {
    return x + y
}

console.log(sum(1, 2))

----
3

当函数体只有一行代码,{}可以省略不写,return关键字也可以省略,上面的代码等价于:

let sum = (x, y) => x + y

console.log(sum(1, 2))
----
3

写到这里,复习了ES5的函数写法,也了解了ES6的箭头函数的写法

现在可以来看看“this指向定义时所在的对象,而不是调用时所在的对象”是什么意思了。

// Mac Pro的键盘敲起来真的是舒服 ^_^

通过例子演示,先来看看ES5中的this:

在html中写一个button,

<button id="btn">完成</button>

然后通过DOM操作获取这个button,给button绑定一个点击事件,此时的this指向button对象,

let btn = document.querySelector('#btn')
btn.addEventListener('click',function() {
    console.log(this)
})

// 在HTML页面中点击按钮
-------------------------------
<button id="btn">完成</button>

给上面的代码加一个定时器 ,把console.log(this)放到setTimeout里面来输出,

let btn = document.querySelector('#btn')
btn.addEventListener('click',function() {
    setTimeout(function () {
        console.log(this)
    }, 1000)
    
})

// 在HTML页面中点击按钮
------------------------------------------------------------------------------------------------
Window {window: Window, self: Window, document: document, name: '', location: Location, …}

我们看到输出了Window {....,这是因为此时的this指向的是调用时的对象,setTimeout是window的对象,this的作用域在{}里面,所以当前对象也就是指的window,上面的代码也可以改成:

window.setTimeout(function () {
        console.log(this)
    }, 1000)

但是,我还是希望等一秒输出,但希望this指向button而不是window,也就是要改变this指向,有三个方法可以实现,call、apply、bind,这里需要用bind代码:

let btn = document.querySelector('#btn')
btn.addEventListener('click',function() {
    window.setTimeout(function () {
        console.log(this) // 希望这个this指向谁,外面的bind就传入谁
    }.bind(this), 1000)
})

// 在HTML页面中点击按钮
-------------------------------
<button id="btn">完成</button>

现在来看如何通过箭头函数来实现改变this的指向

箭头函数里面,this指向定义时所在的对象,而不是调用时所在的对象

let btn = document.querySelector('#btn')
btn.addEventListener('click',function () {
    
    setTimeout(() => {
        console.log(this)
    }, 1000);
})

----------------------------------
<button id="btn">完成</button>

其实箭头函数里并没有this,上面的this是继承了外面一层上下文中的this,所以外面的this就是指向的btn

2、不可以当作构造函数

还是先来看ES5当中如何模拟一个类

用function模拟一个类

function Peple(name, age) {
    console.log(this) //this指向的是peple对象
    this.name = name
    this.age = age
}

let peple = new Peple('Sure','36')
console.log(peple)

---------------------------------------
Peple {}
age: "36"
name: "Sure"
[[Prototype]]: Object
Peple {name: 'Sure', age: '36'}
age: "36"
name: "Sure"
[[Prototype]]: Object

现在把上面的Peple改为箭头函数来试一下

let Peple = (name, age) => {
    this.name = name
    this.age = age
}

let peple = new Peple('Sure','36')
console.log(peple)

------------------------------------------------------------------------------
Peple {}
[[Prototype]]: Objectconstructor: ƒ Peple(name, age)[[Prototype]]: Object

发现Peple里面什么也没有。首先在VS Code脚手架里执行的代码跟浏览器里执行的代码是不一样的,因为当前环境使用webpack完成代码构建,这里面使用了一个叫eval的函数,这个eval可以把字符串作为代码去执行,所以用eval去执行代码会和实际有不同。        

现在把代码放到浏览器中执行,

 现在看到了箭头函数不可以当作构造函数

3、不可以使用arguments对象

先写ES5代码

let test = function () {
    console.log(arguments)
}

test(1, 2, 3)

--------------------------------------------------------------
Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]

现在把它改成箭头函数:

let test = () => {
    console.log(arguments)
}

test(1, 2, 3)

------------------------------------------------------------------
Arguments(3) [{…}, {…}, ƒ, callee: ƒ, Symbol(Symbol.iterator): ƒ]
0: {i: './src/2-7.js', l: true, exports: {…}}
1: {}
2: ƒ __webpack_require__(moduleId)
callee: ƒ (module, exports)
length: 3
Symbol(Symbol.iterator): ƒ values()
[[Prototype]]: Object

虽然也能输出一些参数,但参数已经不是1,2,3了,但也是受eval函数影,现在再放到浏览器中执行看一下:

如果还是想输出1,2,3,可以使用rest运算符实现:

let test = (...args) => {
    console.log(args)
}

test(1, 2, 3)

----------------------
(3) [1, 2, 3]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记 JavaScript ES6 箭头函数 的相关文章

  • 如何从 Javascript 访问 Oracle Apex 变量?

    我正在使用 Oracle APEX 但不确定如何从外部 javascript 文件访问以下变量 该文件可能位于应用程序服务器上或存储在共享组件 gt 静态文件中 APP ID APP PAGE ID APP SESSION 如何从 java
  • 直观地执行不同的排序算法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 动态加载css的方法

    我很早就知道 您可以使用 addRule 和 insertRule 动态地将样式规则加载到页面中 具体取决于它是 IE 还是兼容标准的浏览器 但我刚刚发现 在 Chrome 上 一种更通用 对我来说 的方法效果很好 创建一个 style 元
  • 通过jquery在日期框中自动添加斜杠/符号[重复]

    这个问题在这里已经有答案了 我发现几个问题但没有答案 所以我问问题 如何添加自动斜杠 符号
  • 为什么使用 MongoDB 的 $push 向数组添加新对象时会添加带有 ObjectID 的 _id ?

    我正在使用 Node js 和 Mongoose 玩家和锦标赛变量是之前获取的 Mongoose 对象 我想将一个新的tournamentSession对象 不是Mongoose对象 添加到玩家对象的tournamentSessions字段
  • 首选的客户端路由解决方案? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 组织 jQuery/JavaScript 代码的最佳方式 (2013) [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 问题 这个答案之前已经回答过 但已经
  • Jquery - (重新)连接动态生成的元素

    很多时候 我的元素与附加功能挂钩 例如 myfav autocomplete myfav datepicker myfav click somefunction 但是 当通过某些代码动态生成此类的更多实例时 新的 myfav 已经死了 需要
  • Javascript - 删除粘贴上的空格

    我有一个最大长度为 10 的输入文本字段 该字段用于澳大利亚电话号码 10 位数字 电话号码通常分为以下语法 12 12345678 如果有人复制上面的内容并将其粘贴到我的输入字段中 显然会留下最后一位数字并保留空格 有没有办法在粘贴到输入
  • 使用 JavaScript 设置文本区域样式

    我对 JavaScript 完全陌生 想修改表单的文本区域 由外部脚本生成 如下所示 1 开始时的文本区域 标记为 您的消息 颜色为 rgb 136 136 136 2 焦点上的文本区域 标签已删除 颜色设置为 rgb 0 0 0 3 文本
  • 在javascript/jQuery中设置Java的数据结构

    有没有办法在javascript中像java一样创建集合数据结构 唯一集合 对于一组字符串 我只使用值为 true 的对象 var obj obj foo true obj bar true if obj foo foo in set 这基
  • 获取顶部框架的 URL

    在 Facebook 应用程序中 我需要检查顶部框架 主窗口 URL 是什么 并相应地显示内容 我尝试使用以下内容 if top location toString toLowerCase indexOf facebook com lt 0
  • 性能 - String.charAt(0) 与 /^.{1}/

    从概念上讲哪个应该更快 String charAt 0 or 1 regex String charAt 0 必须处理和应用正则表达式 速度测试资源 Paul S https stackoverflow com users 1615483
  • 仅在文件下载完成后设置 cookie。

    我有一个场景 我想告诉用户下载完成并提示关闭按钮 为此 我使用 jquery 插件来连续监视 cookie 以了解下载何时完成 我的问题是我想设置这个cookie fileDownload true and path 下载完成后立即进行 为
  • 如何使我的网站兼容移动设备和平板电脑? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想让我现有的网站在手机 平板电脑上查看时自动调整 甚至在您在桌面上调整屏幕时自动调整 如果失败的话 如果太难 你有什么建议 我基本上
  • 使用 JS 从列表中删除最近的 元素的 URL

    所以我有一个网址列表 并且有删除按钮 图像按钮 当点击删除按钮时 按钮旁边的 url 必须从列表中删除 let list const remove document getElementById remove const view docu
  • 如何以编程方式将 CSS 定义应用到整个页面?

    我确信该信息已经存在 但我找不到它 对不起 我想使用 JavaScript 创建 CSS 规则 并将它们应用到整个页面 就像它们位于文档头部的样式元素中一样 我不想通过生成 CSS 文本来实现 我想将规则保留为可以更改的实体 JavaScr
  • 如何强制传单更新地图?

    当我将 Leaflet 与 React 一起使用时 我遇到了问题 据我研究 问题是 Leaflet 也想控制 DOM 渲染 现在 国家将使用与后端信息相对应的特定颜色代码 范围为1 gt 100 正确着色 但是 它每分钟更新一次 更新后 国
  • 如何将react-native与php一起使用并获取返回数据始终为空

    我的回报始终为空 我似乎无法让它发挥作用 我如何将react native与php一起使用并获取json 任何人都可以帮忙吗 PHP myArray array myArray lat POST lat myArray lng POST l
  • jQuery - 将日期选择器的容器设置为特定的 div

    我在 div 上使用 jQuery UI 日期选择器 div通过移动鼠标隐藏和显示 因为日期选择器存在于末尾标签 不在我的 div 内 当我将鼠标移动到日期选择器时 div 消失 我像这样加载了日期选择器 JavaScript dt1 da

随机推荐

  • 系统故障-asp.net环境有误

    外播要用电子分call系统 所以他们要安装电子分call系统 去了一看 他们的系统有些问题问题现象 1 所有的toolbar控件 所有的客户端都无法显示这个控件 但只有两个客户端可以显示 经分析是asp组件有问题 所以重新安装asp net
  • 在Vue中使用QRCode生成二维码

    首先安装依赖包 npm cnpm install save qrcode 下面是qrcode vue文件 在script标签导入qrcode import QRCode from qrcode 我一般是写在mounted里面 如果需要什么条
  • 解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题

    application properties 加入以下配置 logback home logging path D logs esb producer logback xml
  • SQL server 数据类型转换

    在 SQL Server 中 CONVERT 和 PARSE 函数可以用于将一个数据值从一种数据类型转换为另一种数据类型 它们与 CAST 函数一样是 SQL Server 中常见的数据类型转换函数 CONVERT 函数 CONVERT 函
  • Scala学习(三)---函数式编程

    文章目录 1 面向对象编程 2 函数式编程是什么 3 函数定义 4 函数参数的特殊用法 5 函数至简原则 6 匿名函数 6 1 匿名函数化简原则 7 高阶函数 7 1 函数可以作为值进行传递 7 2 函数可以作为参数进行传递 7 3 函数可
  • Received fatal alert:handshake_failure 异常解决方法

    目录 1 背景 2 报错信息 3 问题分析 4 解决方法 1 背景 PCI认证 要求安全传输层协议由之前的TLS v1 0 TLS v1 1升级到TLS v1 2 2 报错信息 java lang Exception 接口调用失败 at c
  • 配置Tomcat成为系统服务

    配置Tomcat成为系统服务 这里已tomcat6为例 下载Zip版Tomcat 选择 32 bit Windows zip pgp md5 下载解压文件到指定目录 如 D ProgramFiles Tomcat6 进入D ProgramF
  • Python 微信公众号文章爬取

    Python 微信公众号文章爬取 一 思路 二 接口分析 三 实现 第一步 第二步 1 请求获取对应公众号接口 取到我们需要的fakeid 2 请求获取微信公众号文章接口 取到我们需要的文章数据 四 总结 一 思路 我们通过网页版的微信公众
  • Docker搭建私有仓库

    Docker搭建私有仓库 一 私有仓库搭建 1 拉取私有仓库镜像 docker pull registry 2 启动私有仓库容器 docker run name registry p 5000 5000 registry 3 打开浏览器输入
  • Python判断一个整数是否是回文数的三种方法

    方法一 逐位判断 原理 用一个while循环 将一个数每次都取出首位和末位 判断是否相等 只要有一次不相等退出即可 回文数的判断条件 加入一个变量位数 如果这个数是奇数 位数为1时 即最中间那一位数 此时退出即可 同理 偶数 位数为0时 退
  • LIN诊断实现MCU本地OTA升级

    一 目标 通过PC端上位机实现MCU本地的OTA升级 本篇文章对实现的目的 需要用到的第三方工具 LIN诊断帧 升级协议 MCU端升级过程以及PC端升级过程做详细说明 二 目的 最近在做MCU项目时需要将样机寄给客户进行验证 在客户的验证过
  • 二叉树 level order 遍历问题汇总

    一 如何确定层结束 1 维护一个levelEnd 如果当前结点等于level end 更新levelEnd 为queue back 注意先判断queue是否empty 最后一层结束后 queue就空了 2 维护一个curLevelNum 和
  • 【Kubernetes】Kubernetes的yaml文件中command的使用

    command就是将命令在创建的容器中执行 有这些命令去完成一些工作 command用法和dockerfile中的cmd差不多 command可以单独写 也可以分成command和参数args 可以参考之前的CMD去理解 例如下面的写法都可
  • 超分辨率重建——(一)何为超分和分类

    图像超分辨重建 图像超分辨率 SR 是计算机视觉中提高图像和视频分辨率的一类重要技术 图像超分辨率重建 Super resolution Reconstruction SR 是由一张或多张低分辨率图像得到高分辨率图像的过程 存在问题 传统图
  • 刷脸支付营销广告一站式便捷的应用

    刷脸支付收银系统的应用让消费者自助购物 正规购物过程更加便捷了 同时对于商户来说 还可以通过收银系统的会员管理 会员管理 营销 会员加广告以及服务 为商户提供了收银 店铺管理 营销加广告等一站式便捷的闭环应用 刷脸支付 智慧医疗 智慧校园
  • ETL与ELT理解

    ETL ETL Extract Transform Load 用来描述将数据从来源端经过抽取 Extract 转换 Transform 加载 Load 至目的端的过程 ETL模式适用于小数据量集 如果在转换过程中需要处理的数据量达到千万上亿
  • yum使用报错:Cannot find a valid baseurl for repo: base/$releasever/x86_64

    转自 https www cnblogs com qa freeroad p 13888980 html 背景 项目有几台机器 centos7 时间不准 为了让时间能够定时同步 需要安装ntpdate 然而 我在使用yum安装ntpdate
  • Call From hadoop102/192.168.10.102 to hadoop102:8020 failed on connection exception: java.net.Connec

    错误 which no hbase in opt modules jdk1 8 0 212 bin opt modules jdk1 8 0 212 bin usr local bin usr bin usr local sbin usr
  • STM32 电机教程 24 - ST MCLIB实战之无感变绝对式位置传感器

    前言 上一节给大讲演示了如何用ST MotorControl Workbench创建基本STM32F103C8T6芯片的FOC工程并根据实际电路成功创建了工程 但是实际电路使用的是绝对式磁编码器作为电机位置及速度检测传感器 而ST Moto
  • 学习笔记 JavaScript ES6 箭头函数

    学习内容 this指向定义时所在的对象 而不是调用时所在的对象 不可以当作构造函数 不可以使用arguments对象 1 this指向定义时所在的对象 而不是调用时所在的对象 先来回顾一下ES5当中如何定义函数 function sum x