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 相关文章推荐
基于JQuery制作的产品广告效果
Dec 08 Javascript
js数组的操作详解
Mar 27 Javascript
Express.JS使用详解
Jul 17 Javascript
AngularJS基础学习笔记之指令
May 10 Javascript
JS实现霓虹灯文字效果的方法
Aug 06 Javascript
jQuery遮罩层效果实例分析
Jan 14 Javascript
Node.js中npm常用命令大全
Jun 09 Javascript
JSON字符串和对象相互转换实例分析
Jun 16 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
Vue.js实战之利用vue-router实现跳转页面
Apr 01 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
在node环境下parse Smarty模板的使用示例代码
Nov 15 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
php curl常用的5个经典例子
2017/01/20 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
js 操作符实例代码
2009/10/24 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
python训练数据时打乱训练数据与标签的两种方法小结
2018/11/08 Python
python分布式计算dispy的使用详解
2019/12/22 Python
python实现文字版扫雷
2020/04/24 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
搞笑爱情保证书
2014/04/29 职场文书
党员评议个人总结
2014/10/20 职场文书
中班下学期个人总结
2015/02/12 职场文书
法人代表证明书范本
2015/06/18 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
Apache POI的基本使用详解
2021/11/07 Servers