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 相关文章推荐
js checkbox(复选框) 使用集锦
Apr 28 Javascript
js随机颜色代码的多种实现方式
Apr 23 Javascript
JavaScript中的原型prototype完全解析
May 10 Javascript
AngularJs表单验证实例详解
May 30 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
Jan 04 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
深入探究angular2 UI组件之primeNG用法
Jul 26 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
Vue项目全局配置微信分享思路详解
May 04 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
Postman如何实现参数化执行及断言处理
Jul 28 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
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
python基于右递归解决八皇后问题的方法
2015/05/25 Python
python友情链接检查方法
2015/07/08 Python
快速了解Python相对导入
2018/01/12 Python
numpy返回array中元素的index方法
2018/06/27 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
通过代码实例了解Python异常本质
2020/09/16 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
大学生学期自我鉴定
2014/03/19 职场文书
公司任命书模板
2014/06/06 职场文书
单身证明格式样本
2015/06/15 职场文书
答谢酒会主持词
2015/07/02 职场文书
医院保洁员管理制度
2015/08/05 职场文书
学校远程教育工作总结
2015/08/11 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL