深入理解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闭包 实例分析
Dec 25 Javascript
Jquery插件编写简明教程
Mar 25 Javascript
JS版的date函数(和PHP的date函数一样)
May 12 Javascript
jquery实现通用版鼠标经过淡入淡出效果
Jun 15 Javascript
jQuery可见性过滤器:hidden和:visibility用法实例
Jun 24 Javascript
js实现浏览本地文件并显示扩展名的方法
Aug 17 Javascript
js显示当前日期时间和星期几
Oct 22 Javascript
使用jsonp实现跨域获取数据实例讲解
Dec 25 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
Jul 17 Javascript
简单说说如何使用vue-router插件的方法
Apr 08 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
Oct 31 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
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
浅析Python中的join()方法的使用
2015/05/19 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
浅析Python 多行匹配模式
2020/07/24 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
策划总监岗位职责
2014/02/16 职场文书
学校工会工作总结2015
2015/05/19 职场文书
老人节主持词
2015/07/04 职场文书
活动宣传稿范文
2015/07/23 职场文书
卫生主题班会
2015/08/14 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python