深入理解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 showModalDialog参数的使用详解
Jan 07 Javascript
js实现文本框支持加减运算的方法
Aug 19 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
使用Angular.js实现简单的购物车功能
Nov 21 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
详解plotly.js 绘图库入门使用教程
Feb 23 Javascript
Vuex实现计数器以及列表展示效果
Mar 10 Javascript
小程序实现带年月选取效果的日历
Jun 27 Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 Javascript
JavaScript如何判断input数据类型
Feb 06 Javascript
jquery css实现流程进度条
Mar 26 jQuery
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
JAVA/JSP学习系列之四
2006/10/09 PHP
Get或Post提交值的非法数据处理
2006/10/09 PHP
用PHP将数据导入到Foxmail
2006/10/09 PHP
php5 mysql分页实例代码
2008/04/10 PHP
php 保留字列表
2012/10/04 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
jquery实现上传文件进度条
2020/03/26 jQuery
写一个Vue loading 插件
2020/11/09 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
在双python下设置python3为默认的方法
2018/10/31 Python
python中实现词云图的示例
2020/12/19 Python
纯CSS3编写的的精美动画进度条(无flash/无图像/无脚本/附源码)
2013/01/07 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
借款协议书范本
2014/04/22 职场文书
物业品质提升方案
2014/06/08 职场文书
关于召开会议的通知
2015/04/15 职场文书
音乐课外活动总结
2015/05/09 职场文书