深入理解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 相关文章推荐
js实现倒计时(距离结束还有)示例代码
Jul 24 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 Javascript
jquery 实现返回顶部功能
Nov 17 Javascript
百度地图api如何使用
Aug 03 Javascript
基于BootStarp的Dailog
Apr 28 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
Sep 14 Javascript
Angularjs中使用layDate日期控件示例
Jan 11 Javascript
巧用weui.topTips验证数据的实例
Apr 17 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 Javascript
详解Vue中的scoped及穿透方法
Apr 18 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
Jun 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 session 错误
2009/05/21 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
laravel model 两表联查示例
2019/10/24 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JS 显示当前日期与时间的代码
2010/03/24 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
jquery等待效果示例
2014/05/01 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
荷兰家电销售网站:Welhof
2020/12/08 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
2014全国两会大学生学习心得体会
2014/03/10 职场文书
保护环境的建议书
2014/03/12 职场文书
励志演讲稿600字
2014/08/21 职场文书
债务纠纷起诉书
2015/05/20 职场文书
军训新闻稿范文
2015/07/17 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python