深入理解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 相关文章推荐
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
利用webqq协议使用python登录qq发消息源码参考
Apr 08 Javascript
一个封装js代码-----展开收起效果示例
Jul 03 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
JavaScript中的对象与JSON
Jul 03 Javascript
javascript中apply、call和bind的使用区别
Apr 05 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 Javascript
webpack构建的详细流程探底
Jan 08 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
Jul 20 Javascript
js如何实现元素曝光上报
Aug 07 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 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python入门篇之列表和元组
2014/10/17 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
J2EE中常用的名词进行解释
2015/11/09 面试题
企业宗旨标语
2014/06/10 职场文书
委托书的格式
2014/08/01 职场文书
培训科主任岗位职责
2014/08/08 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang