2016-11-26 4 views
1

wie mit SetInterval und Konstruktor Methode arbeiten. console.log wird undefined angezeigt. Kann jemand erklären, warum und wie auf die Variable des Konstruktors von setInterval zugegriffen wird.Wie arbeite ich mit setInterval und Konstruktor?

var aa=new test(); 
var bb; 
window.onload= function(){ 
    bb=setInterval(aa.b,1000); 
} 
function test(){ 
    this.a=1; 
    this.b=function(){ 
     console.log(this.a); 
    } 
} 

Antwort

2

Versuchen Sie es in einer Funktion wie diese Verpackung:

setInterval(() => aa.b(), 1000); 

Der Grund Weg nicht funktioniert, ist, dass Sie die b-Funktion zum setInterval passieren, aber es verliert es dann this Referenz, so this wird das globale Fensterobjekt und window.a ist nicht definiert.

Umwickeln Sie es in einer Funktion machen die thisaa sein, wie Sie die Funktion auf dem Objekt aa aufrufen.

Wenn Sie Ihre Funktion in einer anderen Funktion nicht wickeln möchten, können Sie auch bind verwenden:

setInterval(aa.b.bind(aa), 1000); 

die hier this gezwungen wird aa zu sein.

+0

Oh com‘ auf! :) Ich habe kurz vor Ihnen über "bind version" geantwortet :) –

+0

Das verpasst. +1 für dich –

1

Die anderen sind korrekt - die this bezieht sich nicht auf test Instanz mehr, ein einfacher Weg zu beheben (richtig) ist dies eine neue Variable:

var aa=new test(); 
var bb; 
window.onload= function(){ 
    bb=setInterval(aa.b,1000); 
} 
function test(){ 
    var self = this; //keep the right 'this'. 
    this.a=1; 
    this.b=function(){ 
     console.log(self.a); //changed, `self` instead of `this` 
    } 
}