深入理解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 相关文章推荐
Array.prototype.concat不是通用方法反驳[译]
Sep 20 Javascript
JavaScript执行顺序详细介绍
Dec 04 Javascript
jquery解析xml字符串示例分享
Mar 25 Javascript
javascript实现复选框选中属性
Mar 25 Javascript
JavaScript中的Array 对象(数组对象)
Jun 02 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
ES6扩展运算符用法实例分析
Oct 31 Javascript
微信小程序自定义轮播图
Nov 04 Javascript
vue缓存之keep-alive的理解和应用详解
Nov 02 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 header函数使用教程
2013/09/05 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
Python Unittest自动化单元测试框架详解
2018/04/04 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
Java面试题及答案
2012/09/08 面试题
机械制造与自动化应届生求职信
2013/11/16 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
全网非常详细的pytest配置文件
2022/07/15 Python