深入理解Javascript箭头函数中的this

 更新时间:2017年02月13日 08:36:04   作者:Heero.Luo  
ES6标准新增了一种新的函数:Arrow Function(箭头函数)。那么下面这篇文章主要给大家介绍了箭头函数中this的相关资料,有需要的朋友可以参考借鉴,下面来一起看看吧。

首先我们先看一段代码,这是一个实现倒数功能的类「Countdown」及其实例化的过程:

function Countdown(seconds) {
 this._seconds = seconds;
}
Countdown.prototype._step = function() {
 console.log(this._seconds);
 if (this._seconds > 0) {
  this._seconds -= 1;
 } else {
  clearInterval(this._timer);
 }
};
Countdown.prototype.start = function() {
 this._step();
 this._timer = setInterval(function() {
  this._step();
 }, 1000);
};

new Countdown(10).start();

运行这段代码时,将会出现异常「this._step is not a function」。

这是Javascript中颇受诟病的「this错乱」问题:setInterval重复执行的函数中的this已经跟外部的this不一致了。

要解决这个问题,有三个方法。

闭包

新增一个变量指向期望的this,然后将该变量放到闭包中:

Countdown.prototype.start = function() {
 var self = this;
 this._step();
 this._timer = setInterval(function() {
  self._step();
 }, 1000);
};

bind函数

ES5给函数类型新增的「bind」方法可以改变函数(实际上是返回了一个新的函数)的「this」:

Countdown.prototype.start = function() {
  this._step();
  this._timer = setInterval(function() {
    this._step();
  }.bind(this), 1000);
};

箭头函数

这正是本文要重点介绍的解决方案。箭头函数是ES6中新增的语言特性,表面上看,它只是使匿名函数的编码更加简短,但实际上它还隐藏了一个非常重要的细节——箭头函数会捕获其所在上下文的this作为自己的this。也就是说,箭头函数内部与其外部的this是保持一致的。

所以,解决方案如下:

Countdown.prototype.start = function() {
  this._step();
  this._timer = setInterval(() => {
    this._step();
  }, 1000);
};

这无疑使this的处理更加方便了。然而,对各位Javascript Coder而言,判断this指向时的情况可就又多了一种了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • JavaScript DOM常用操作代码汇总

    JavaScript DOM常用操作代码汇总

    这篇文章主要介绍了JavaScript DOM常用操作代码汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • JavaScript 检测浏览器和操作系统的脚本

    JavaScript 检测浏览器和操作系统的脚本

    代码转自《Professional JavaScript™ for Web Developers》一书。
    2008-12-12
  • 完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题

    完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题

    下面小编就为大家分享一篇完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • JavaScript柯里化函数式编程面试详解

    JavaScript柯里化函数式编程面试详解

    这篇文章主要介绍了JavaScript柯里化函数式编程,JS柯里化是前端面试中最常见的问题之一,它可以让你的代码更简洁,工作更高效,感兴趣想要详细了解可以参考下文
    2023-05-05
  • JS函数进阶之prototy用法实例分析

    JS函数进阶之prototy用法实例分析

    这篇文章主要介绍了JS函数进阶之prototy用法,结合实例形式分析了JavaScript函数中使用prototy扩展属性相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • 使用JavaScript实现轮播图效果

    使用JavaScript实现轮播图效果

    这篇文章主要为大家详细介绍了使用JavaScript实现轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 利用JS实现scroll自定义滚动效果详解

    利用JS实现scroll自定义滚动效果详解

    这篇文章主要给大家介绍了关于利用JS如何实现scroll自定义滚动效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • js 针对html DOM元素操作等经验累积

    js 针对html DOM元素操作等经验累积

    这篇文章主要介绍了js 针对html DOM元素操作等经验累积,需要的朋友可以参考下
    2014-03-03
  • Cookie 注入是怎样产生的

    Cookie 注入是怎样产生的

    现在很多网站都加了防注入系统代码,你输入注入语句将无法注入~~感觉这样的防注入系统不错,但防注入系统没有注意到 Cookies 的问题!所以就有了Cookies注入~~
    2009-04-04
  • TypeScript中正确使用interface和type的方法实例

    TypeScript中正确使用interface和type的方法实例

    在ts中定义类型由两种方式:接口(interface)和类型别名(type alias),interface只能定义对象类型,下面这篇文章主要给大家介绍了关于TypeScript中正确使用interface和type的相关资料,需要的朋友可以参考下
    2021-09-09

最新评论