当前位置:首页 > 日记 > 正文

深入理解Javascript箭头函数中的this

深入理解Javascript箭头函数中的this

首先我们先看一段代码,这是一个实现倒数功能的类「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指向时的情况可就又多了一种了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

Vue生命周期示例详解

Vue生命周期示例详解

生命周期,示例,详解,电脑软件,Vue,首先看看Vue文档里关于实例生命周期的解释图那么下面我们来进行测试一下<section id="app-8"> {{data}}</section>var myVue=new Vue({ el:"#app-8", data:{ data:"aaaaa", info:"nono" },…

浅谈js中用$ | #ID来作为选择器的

浅谈js中用$ | #ID来作为选择器的

选择器,浅谈,中用,电脑软件,ID,虽然经常用但是今天用这个去选的时候,发现怎么都设置不上值经调查,id选择器是选择页面内全部的对象中的第一个问题就在这------------因为以前项目里面没有说对这个弹出框做什么操作,所有id重复了也没管。所以,需…

提高WPS文字排版速度有哪些小技巧

提高WPS文字排版速度有哪些小技巧

文字排版,小技巧,速度,有哪些,电脑软件,  提高WPS文字排版速度的几个小技巧,这个一定要学习一下。可以了解各种文字排版和快捷键,提高自己的操作速度。以下是小编为您带来的关于提高WPS文字排版速度的小技巧,希望对您有所帮助。提高WPS文字…

手机qq怎么设置拒绝任何人添加手机

手机qq怎么设置拒绝任何人添加手机

设置,方法,好友,电脑软件,qq,  不想手机QQ总是接收到任何人的好友申请,我们应该怎么办呢?其实可以设置拒绝任何人添加。这里小编就来为大家分享手机qq怎么设置拒绝任何人添加!手机qq设置拒绝任何人添加的方法登陆手机QQ , 然后点击 &ldquo;…

jQuery为DOM动态追加事件的方法

jQuery为DOM动态追加事件的方法

事件,动态,追加,方法,电脑软件,处理一个列表绑定,因为是一个展示项目,没有使用复杂的插件,直接jsrender写了个模板,但是后面有一个操作按钮,去查看数据详情,想到了jquery使用on进行事件委托,然后就开搞最初是这样写的:$(".btn-open").on("click…

Javascript中字符串和数字的操作方

Javascript中字符串和数字的操作方

字符串,操作方法,数字,电脑软件,Javascript,1、length – 返回字符串的长度‘abcd'.length; //4 2、Math.ceil(num) – 向上取整,不管小数点后面是多少,哪怕.00001,也会向上进一位。Math.ceil(25.9); //26 Math.ceil(25.5); //26 Math.ceil(2…

js 用于检测类数组对象的函数方法

js 用于检测类数组对象的函数方法

数组,检测,用于,方法,函数,如下所示://判定o是否是一个类数组对象//字符串和函数有length属性,但是它们//可以用typeof检测将其排除。在客户端JavaScript中,DOM文本节点//也有length属性,需要用额外判断o.nodeType!=3将其排除function isArrayL…

ps如何添加文字在上

ps如何添加文字在上

文字,方法,在上,图片,电脑软件,  添加文字在图片上面很常见,这样才可以达到图文并茂的感觉。接下来就是小编精心整理的一些关于ps如何添加文字在图片上的相关资料,供你参考。ps添加文字在图片上的方法1、比如要在这张图片上输入一句话&ldqu…

wps版word怎么从第二页设置页眉页

wps版word怎么从第二页设置页眉页

设置,页眉,方法,文档,电脑软件,  在写论文的过程中,编辑、打印文档等,正文一般都需要页眉和页脚,那么大家知道怎么在word中设置页眉页脚吗?下面给大家介绍如何从第二页设置页眉页脚的方法吧,欢迎大家来到学习。wps版word从第二页设置页眉页脚…

jquery实现平滑滚动详解

jquery实现平滑滚动详解

平滑,详解,电脑软件,jquery,本文实例为大家分享了jquery图片平滑滚动效果的具体代码,供大家参考,具体内容如下随便写了个DOM,没有美观性,见谅原理:1、定义两组ul列表放图,第一个ul放5张图,第二个ul为空2、为什么要用两个ul?因为要用到jQuery的克隆…

ps抠图后怎么更换背景

ps抠图后怎么更换背景

抠图,方法,背景,电脑软件,ps,  如果图片的背景需要更换,大家可以使用ps抠图的方法,然后再更换。很多刚学习的新手小伙伴可能还不知道,下面是小编带来关于ps抠图后怎么更换背景的内容,希望可以让大家有所收获!ps抠图后更换背景的方法首先第一…

excel日期函数的使用excel计算时间

excel日期函数的使用excel计算时间

日期函数,日期,计算,函数,时间,  excel日期函数是我们经常使用的程序,日期与时间函数是指在公式中用来分析和处理日期值和时间值的函数。下面小编举几个能计算时间和日期的函数。希望对你有帮助!excel日期函数的使用excel日期函数的使用1:例…