setInterval里面this指向的是window,下面的函数怎么理解

2016/12 01 09:12
此文章不得转载,如有需要请联系网站管理员。

一度的温暖,一百度的爱情,来自于www.bwin2299.com的点点滴滴

function Aaa{
    this.a = 12;
    setIntervalthis.show,1000;
}
Aaa.prototype.show = function{
    console.logthis.a;
}
var a = new Aaa;
    

按照理解window里没有show的办法,后果打印出来的是a东西,理解不了,求大神辅导

setInterval里面的this指向的是window东西。

精确说应该是setInterval第一个回调函数运转时,外部上下文this, 而不是传参时那个this。

// this指向以后上下文
setIntervalthis.show, 1000

// this指向window
setIntervalfunction{
    this.show;
}, 1000;

改正一下此中的错误,

    setIntervalthis.show, 1000 // 这个this指向以后上下文没题目
    // 等价于
    setIntervalfunction{
        console.logthis.a; 
         //这里的this还是指向window 实际输入的是window.a 
         // 后面定义时var a = new Aaa被误导了
         // 修正一下变量名 var aa = new Aaa; 应该输入undefined;
    }, 1000

答复这个题目,只用个二三句话是很难答复得明晰,要用拐弯抹角的讲法,说真实都有点对又不太对。

我猜测你应该是想要打印12的后果,而不是如今的Aaa {a:12}这个后果。题目在于setInterval你猜对了。

最大的题目源头是,JS是个脚本言语,定义是定义,实行是实行,关于函数更是云云,你作了函数的定义或当值来转达,并不代表它一定在实行时不会因此改动,this值便是有可以改动后果的变因。

这段代码会怎样实行?次序又是什么,大致上模仿一下:

到`Aaa.prototype.show`这行,prototype物件先指定show成员,此中内容为`function{console.logthis.a}`

到`var obj = new Aaa;`这行,读取Aaa中函数定义,并把函数中定义的`this`主动指向到obj变量。

进入到Aaa函数区块中,`this.a=12`,以是指定`obj.a=12`,连住原型链。

Aaa函数区块中实行`setIntervalthis.show,1000;`,`this.show`作为参数,相称于obj.show中的属性成员,obj中没有,往原型链上找,找到prototype物件中有,以是setInterval中相称于以下的指定:

`setIntervalfunction{console.logthis.a}, 1000`

`setInterval`中的实行函数代码送就任务伫列去,等会主实行线完成后再返来实行上下文堆叠中实行。

Aaa函数区块中实行毕,方才`setInterval`中的实行函数代码返来实行上下文堆叠。

实行`console.logthis.a`,作用域于全局,this指向window,输入window.a,相称于`Aaa {a:12}`

之后,`setInterval`中实行函数代码重覆实行。

呃,下面看完了。那怎样让setIntervalthis.show,1000;在实行时能打印出this.a的值,提及来复杂,改成像下面如许就行了,但为何能如许作,提及来也是满大一串的:

setIntervalthis.show.bindthis,1000;

下面题外话,只是撰写调试的小发起供参考。

第1是为什么要用异样的变量称号?这例子里呈现了二个a变量,一个在函数里,一个在里面全局,英笔墨元有26个,再加上可以大小写与种种黑白纷比方的组合,一定要用异样的变量称号,是要检验自己还是检验来看代码的人?在show函数中究竟是想要输入函数中的a,还是里面的东西a?

第二是为什么在调试时要用setInterval而不用setTimeout,这两个不是类似的服从,差别是setTimeout只实行一次而已。问我说这么讲究作什么?题目是setInterval是不断实行下去,异样的代码你实行一次看到后果不同错误,难道第二次有可以变精确?并且这在调试时十分方便,我假如把代码贴到主控台测,它不断实行不停,不就又要想办法先关失它再作第二次修正再实行。

我都要先改写过代码如下才干调试:

function Aaa{
    this.a = 12;
    setTimeoutthis.show,1000;
}
Aaa.prototype.show = function{
    console.logthis.a;
}
var obj = new Aaa;

补充阐明

setInterval的第一个传入值,要是个回调函数,等到工夫到要移回主实行线中实行的。回调函数,预设呼唤它的必是window物件,也便是函数区块中的this预设是window

看到很多答复的人也曲解了,特别谈一下,下面这两个例子有何差别?

//第1例
setIntervalthis.show, 1000;

//第2例
setIntervalfunction{this.show;}, 1000;

第1例在实行到这行时,实际会变化为下面如许,这才算函数:

//第1例
setIntervalfunction{console.logthis.a;}, 1000;

在本标题中,最后的第1例与第2例的this值都是window东西,以是辨别要实行的是下面这两个,后果写后面表明:

//第1例
console.logwindow.a; //Aaa {a:12}

//第2例
window.show; //报错,由于show函数不存在全局中没有

真正要解让setInterval可以是输入a东西中的a属性,只要一种途径,让传入的这个回调函数的this值钉住,让它一定指到实行当下的东西,所谓的钉住主要是要获得在实行的那临时辰的this值,你可以记取它或直接把原来的输入语句改写。

如今我知道有三种处理的方案,以下列出来:

1. 用bind办法。这是个函数中自带的办法,可以用个物件来”绑定”某个函数后,回传一个新已绑定的函数。普通用这个方案,不过要习气一下。

setIntervalthis.show.bindthis, 1000;

2. 用setInterval的第三个传入参数值,把this传入作为that用,实行的是that.show。留意这方法在IE9之前的阅读器版本不相容。

//最后一个传入this出来
setIntervalfunctionthat{that.show;}, 1000, this;

注: that随意变量名,有人也用self_that等等

3. IIFE解法,也是要传入this到IIFE中,与下面见解类似。IIFE一实行时就会结实住that,这里是实行that.show,而不是有可以会变的this.show:

function that{
    setIntervalfunction{that.show;}, 1000;
}this;

注: that随意变量名,有人也用self_that等等

以上,算补充内容,有兴味可以套用尝尝。

当实行到 new Aaa时,function Aaa中的this就曾经绑定成新创立的object了。

function Aaa{
    this.a = 12;
    setIntervalthis.show.bindthis,1000;
}

可以绑定 this

this指的是,调用函数的那个东西

Javascript的this用法

  • setInterval里的函数this指向window,没错,这也正是打印a东西的缘由;

  • 调用了a东西真实是原型的show办法,这也没错,由于在Aaa里你给setInterval传的this便是a东西;

function Aaa{

this.a = 12;
setIntervalthis.show,1000;//这里的this指向的是创立的新东西Aaa,以是调用了show办法

}
Aaa.prototype.show = function{

console.logthis.a;//这里能this指的是window了,以是this.a便是你下面创立的全局a

}
var a = new Aaa;//这里a援用了新东西Aaa

实行new Aaa后,构造函数以及原型上的this将指向a,
setIntervalthis.show,1000同等于setIntervala.show,1000

这个打印的便是window.a

//留意下面两个this的差别就好了
setIntervalthis.show, 1000

setIntervalfunction{
    this.show;
}, 1000;

谢邀。
但是他人曾经答复得很好了(已点赞),我就未几说了。我只想说一点:

这里的this是什么跟setInterval没有任何干系!!!

你把setInterval换成任何函数,this该是啥还是啥。记取一点:this是它地点的那个函数详细到这里便是那个构造函数)被调用的方法确定的。

(看完/读完)这篇文章有何感想! 来看看www.bwin2299.com是怎么评论的吧!

--转载请注明: bwin2299必赢亚洲_www.bwin2299.com_bwin2299必赢亚洲世界顶级公司 » setInterval里面this指向的是window,下面的函数怎么理解

发表评论

(必填)