深入理解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 相关文章推荐
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
JS 常用校验函数
Mar 26 Javascript
jquery中文乱码的多种解决方法
Jun 21 Javascript
获取select元素被选中的文本内容的js代码
Jan 29 Javascript
jquery分页对象使用示例
Apr 01 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
May 10 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
May 02 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
JS自动生成动态HTML验证码页面
Jun 14 Javascript
使用vue + less 实现简单换肤功能的示例
Feb 21 Javascript
vue项目中应用ueditor自定义上传按钮功能
Apr 27 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 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
PL-880隐藏功能
2021/03/01 无线电
PHP中创建并处理图象
2006/10/09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
Python创建xml的方法
2015/03/10 Python
python比较两个列表大小的方法
2015/07/11 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
应聘教师自荐书
2014/06/16 职场文书
个人收入证明范本
2014/09/18 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js
python周期任务调度工具Schedule使用详解
2021/11/23 Python