深入理解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 相关文章推荐
DOM精简教程
Oct 03 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
JS解决ie6下png透明的方法实例
Aug 02 Javascript
JavaScript 动态加载脚本和样式的方法
Apr 13 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
Nov 25 Javascript
Bootstrap基本组件学习笔记之分页(12)
Dec 08 Javascript
JS出现失效的情况总结
Jan 20 Javascript
jquery.uploadView 实现图片预览上传功能
Aug 10 jQuery
vue的一个分页组件的示例代码
Dec 25 Javascript
分享ES6的7个实用技巧
Jan 18 Javascript
详解微信小程序的不同函数调用的几种方法
May 08 Javascript
详解es6新增数组方法简便了哪些操作
May 09 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
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
javascript定时器完整实例
2015/02/10 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
Javascript复制实例详解
2016/01/28 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
基于Python+QT的gui程序开发实现
2020/07/03 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
电气自动化自荐信
2013/10/10 职场文书
高级销售员求职信
2013/10/25 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle
Redis中一个String类型引发的惨案
2021/07/25 Redis
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android