深入理解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 相关文章推荐
javascript 词法作用域和闭包分析说明
Aug 12 Javascript
javascript题目,重写函数让其无限相加
Feb 15 Javascript
js简单实现根据身份证号码识别性别年龄生日
Nov 29 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
javascript面向对象之访问对象属性的两种方式分析
Jan 13 Javascript
在Javascript中处理数组之toSource()方法的使用
Jun 09 Javascript
基于JQuery实现分隔条的功能
Jun 17 Javascript
javascript鼠标滑过显示二级菜单特效
Nov 18 Javascript
js实现带缓动动画的导航栏效果
Jan 16 Javascript
js实现符合国情的日期插件详解
Jan 19 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 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购物网站支付paypal使用方法
2010/11/28 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
vue 利用路由守卫判断是否登录的方法
2018/09/29 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
在Python中使用第三方模块的教程
2015/04/27 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
基于Django用户认证系统详解
2018/02/21 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
小班下学期评语
2014/05/04 职场文书
学生党员检讨书范文
2014/12/27 职场文书
话题作文之成长
2019/12/09 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android