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


Posted in Javascript onFebruary 13, 2017

首先我们先看一段代码,这是一个实现倒数功能的类「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 相关文章推荐
JSON 客户端和服务器端的格式转换
Aug 27 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
jquery和js实现对div的隐藏和显示方法
Sep 26 Javascript
javascript Deferred和递归次数限制实例
Oct 21 Javascript
AngularJs自定义服务之实现签名和加密
Aug 02 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
vue.js选中动态绑定的radio的指定项
Jun 02 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
Nov 01 Javascript
如何重置vue打印变量的显示方式
Dec 06 Javascript
Vue传参一箩筐(页面、组件)
Apr 04 Javascript
微信小程序自定义胶囊样式
Dec 27 Javascript
ES6学习之变量的解构赋值
Feb 12 #Javascript
AngularJS实现路由实例
Feb 12 #Javascript
jQuery文字轮播特效
Feb 12 #Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 #Javascript
jQuery、zepto、js常用小技巧
Feb 12 #Javascript
JS中如何实现Laravel的route函数详解
Feb 12 #Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 #Javascript
You might like
PHP将XML转数组过程详解
2013/11/13 PHP
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
浅析php单例模式
2014/11/25 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
党章学习思想汇报
2014/01/14 职场文书
留学经费担保书
2014/05/12 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
未婚证明格式
2015/06/15 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Mysql数据库命令大全
2021/05/26 MySQL