美文网首页
es6的this的指向性问题详解(接着上一篇文章)

es6的this的指向性问题详解(接着上一篇文章)

作者: 越努力越幸运_952c | 来源:发表于2018-05-08 13:45 被阅读0次

我们都知道在es6中函数的扩展多了箭头函数,那么箭头函数中的this如何指向呢?

下面我们来看一看:

其实es6的this指向就是一句话,this对象的指向是可变的,但是在箭头函数中,他是固定的。函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象

setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以输出的是42。

箭头函数可以让setTimeout里面的this,绑定定义时所在的作用域,而不是指向运行时所在的作用域。下面是另一个例子。

Timer函数内部设置了两个定时器,分别使用了箭头函数和普通函数。前者的this绑定定义时所在的作用域(即Timer函数),后者的this指向运行时所在的作用域(即全局对象)。所以,3100 毫秒之后,timer.s1被更新了 3 次,而timer.s2一次都没更新。

箭头函数可以让this指向固定化,这种特性很有利于封装回调函数。下面是一个例子,DOM 事件的回调函数封装在一个对象里面。

上面代码的init方法中,使用了箭头函数,这导致这个箭头函数里面的this,总是指向handler对象。否则,回调函数运行时,this.doSomething这一行会报错,因为此时this指向document对象。

this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。

所以,箭头函数转成 ES5 的代码如下

上面代码之中,只有一个this,就是函数foo的this,所以t1、t2、t3都输出同样的结果。因为所有的内层函数都是箭头函数,都没有自己的this,它们的this其实都是最外层foo函数的this。

除了this,以下三个变量在箭头函数之中也是不存在的,指向外层函数的对应变量:arguments、super、new.target。

上面代码中,箭头函数内部的变量arguments,其实是函数foo的arguments变量。

另外,由于箭头函数没有自己的this,所以当然也就不能用call()、apply()、bind()这些方法去改变this的指向。

上面代码中,箭头函数没有自己的this,所以bind方法无效,内部的this指向外部的this。

长期以来,JavaScript 语言的this对象一直是一个令人头痛的问题,在对象方法中使用this,必须非常小心。箭头函数”绑定”this,很大程度上解决了这个困扰。

原文来自:阮一峰ECMAScript 6 入门

相关文章

  • es6的this的指向性问题详解(接着上一篇文章)

    我们都知道在es6中函数的扩展多了箭头函数,那么箭头函数中的this如何指向呢? 下面我们来看一看: 其实es6的...

  • JavaScript中call()、apply()、bind()

    call()、apply()、bind() 都是用来改变this指向的。 关于this 详解,可以看我另一篇文章J...

  • es5的this的指向性问题(详解)

    在说this的指向性问题之前,咱们先说一下函数的调用位置,调用位置就是函数在代码中被调用的位置。 1、下面我们来看...

  • es6的this指向问题

    es6的this指向问题

  • Java 并发学习笔记(二)

    以下内容接前一篇文章: Java 并发学习笔记(一)——原子性、可见性、有序性问题 六、等待—通知机制 什么是等待...

  • Socket详解(四)

    Socket详解(一)Socket详解(二)Socket详解(三) 前三篇文章已经分别介绍了传输层、网络层、网络接...

  • 接着上一篇文章

    第三个亮点是先天性儿童疾病保障,针对还未查出的先天性儿童疾病,所以新生儿一定要尽早投保。保险公司接受出生14天后的...

  • this、call、apply、bind

    this的指向(this永远指向最后调用它的那个对象) 改变this指向 ES6函数箭头 在函数内部使用 var...

  • Django - 模板标签详解

    接着上一篇 urls与视图详解 继续往下讲 一、模板查找路径 mysite/setting.py: 模板查找的优先...

  • ES6之this指向

    ES6之this指向 前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现,...

网友评论

      本文标题:es6的this的指向性问题详解(接着上一篇文章)

      本文链接:https://www.haomeiwen.com/subject/hceirftx.html