JavaScript基础之this和箭头函数详析


Posted in Javascript onSeptember 05, 2019

箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。

由于箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this),他们的第一个参数会被忽略。

前言

阅读下面的内容要先看下《你不知道的javascript(上)》中的第二部分:this和对象原型(里面对于this指向的理论部分主要来源于该书)。

问题

这周在写代码的时候,听同事在说箭头函数无法更改this的指向,并且使用下面代码进行验证:

// (1) 使用箭头函数,this一直指向window
var a = 0
var obj1 = {
  a: 1,
  fn: () => { console.log(this.a) }
}
obj1.fn() // 结果:0

var obj2 = {
  a: 2
}
obj2.fn = obj1.fn
obj2.fn() // 结果:0
// (2)不使用箭头函数,this的指向会更改
var obj3 = {
  a: 3,
  fn: function() { console.log(this.a) }
}
obj3.fn() // 结果:3

第一段代码,无论fn绑定在哪个对象上,this.a始终指向全局的a(在非严格模式下的浏览器中我们可认为是window)

然而,这种说法是有问题(我认为)。

先理解this

this代表什么取决于:

  1. 调用位置
  2. 四种绑定规则
var a = 0
test() // 调用位置在此,通过【默认绑定规则】,可知test的this绑定到了window上
function test() {
  console.log(this) // this是window
  var obj1 = {
    a: 1,
    fn: function() {
      console.log(this) // this是obj1
      console.log(this.a) 
    }
  }
  obj1.fn() // 调用位置在此,通过【隐式绑定规则】,可知fn中的this绑定到了obj1上
  var obj2 = {
    a: 2
  }
  obj2.fn = obj1.fn
  obj2.fn() // 调用位置在此,【隐式绑定规则】,可知fn内的this绑定到了obj2
}

箭头函数中的this

其实这么起标题不太准确(然而想不出好的名字),因为箭头函数是不会创建自己的this的(MDN),那么下面代码的this是来源于哪里的呢?

var obj3 = {
  a: 3,
  fn: () => {
    console.log(this.a)
  }
}
obj3.fn() // 调用位置在此,this指向window
arrowFoo1() // (1)此处是调用位置,使用【默认的绑定规则】,this = window
function arrowFoo1() {
  var obj1 = {
    vv: 'svv1',
    fn: () => {
      console.log(this.vv, 'vv的值是')
    }
  }
  // (2)调用位置是此处,若fn不是箭头函数,那么这里也会有自己的this(即【隐式调用规则】,this绑定为obj1),而fn是箭头函数,则它没有this,那么fn内部调用的this是谁?
  // 这时候需要根据作用域的规则,往外层查找,找到哪里?找到调用obj1.fn的调用栈,即arrowFoo1函数的this,那么从(1)中可知,那个this指向的是window
  obj1.fn()
  var obj2 = {
    vv: 'svv2',
  }
  obj2.fn = obj1.fn
  obj2.fn()
}
function arrowFoo2() {
  var vv = '哦哦哦哦哦'
  console.log(this.vv, 'vv的值是')
}

因此,箭头函数里面要是用到了this,那么其实它是通过作用域链,往外进行查找的,找到了就直接返回咯。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
jquery为页面增加快捷键示例
Jan 31 Javascript
使用C++为node.js写扩展模块
Apr 22 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 Javascript
很棒的vue弹窗组件
May 24 Javascript
原生js实现简单的链式操作
Jul 04 Javascript
微信小程序 本地图片按照屏幕尺寸处理
Aug 04 Javascript
JavaScript实现全选取消效果
Dec 14 Javascript
使用layui 渲染table数据表格的实例代码
Aug 19 Javascript
electron中使用bootstrap的示例代码
Nov 06 Javascript
vue v-for 使用问题整理小结
Aug 04 Javascript
layer.js open 隐藏滚动条的例子
Sep 05 #Javascript
Layui数据表格跳转到指定页的实现方法
Sep 05 #Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
Sep 05 #Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 #Javascript
利用d3.js制作连线动画图与编辑器的方法实例
Sep 05 #Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 #Javascript
layui 实现table翻页滚动条位置保持不变的例子
Sep 05 #Javascript
You might like
用Simple Excel导出xls实现方法
2012/12/06 PHP
php MessagePack介绍
2013/10/06 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
JavaScript中的property和attribute介绍
2011/12/26 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
JavaScript中Function详解
2015/02/27 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
python进阶教程之文本文件的读取和写入
2014/08/29 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
英国最大的百货公司:Harrods
2016/08/18 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
法律专业应届本科毕业生求职信
2013/10/25 职场文书
生日寄语大全
2014/04/08 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
社会实践的活动方案
2014/08/22 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
手写实现JS中的new
2021/11/07 Javascript