2016-04-11 10 views
2

Wie unten Code, ich ein Objekt namens "test", und geben Sie Eigenschaften und Methode.Warum Objekteigenschaft undefiniert wurde, wenn setInterval verwendet

Das Eigentum kam von seinem Argument.

Und ich versuche, die Methode alle 2 Sekunden nach dem Laden aufzurufen, und das Ergebnis zeigt undefined.

Aber wenn ich nur die Methode aufrufen, mit setInterval() nicht, wie dieser

window.onload = function() { 
    giveword.showWord(); 
} 

Ich werde in der Lage, den Text „Hallo“ zu zeigen .. Warum ist das so?

var giveword = new test("Hi"); 

function test(word) { 
    this.word = word; 
} 

test.prototype.showWord = function() { 
    document.getElementById("msg_box").innerHTML = this.word; 
} 

window.onload = function() { 
    setInterval(giveword.showWord, 2000); 
} 

Dank für die Hilfe ...

+0

Das Problem ist, dass 'this' nicht auf' giveword' gesetzt ist, wenn Sie übergebe es so an 'setInterval'. –

+3

Mögliche Duplikate von [setInterval, das, wieder] (http://stackoverflow.com/questions/27570546/setinterval-this-again) –

+0

Lesen Sie "this" http://qr.ae/RO44Vn – Redu

Antwort

2

Der Grund ist, weil in Ihrem test.prototype.showWord funktioniert Ihr this Objekt wird in den Kontext bezieht, in dem die Funktion aufgerufen wird, die das Fensterobjekt ist, wenn aufgerufen von setInterval.

Ich denke, was Sie tun möchten, verwenden Sie ist eine Schließung den Kontext showWord zu machen() die giveword Beispiel wie folgt aus:

 var giveword = new test("Hi"); 

     function test(word) { 
      this.word = word; 
     } 

     test.prototype.showWord = function() { 
      document.getElementById("msg_box").innerHTML = this.word; 
     } 


     window.onload = function(){ 
      setInterval(function(){giveword.showWord();}, 2000); // <<-- here's the closure 
     } 

Der Unterschied besteht darin, dass mit der Schließung Sie die setInterval doch sagen, Funktion, um eine Funktion innerhalb des Kontextes aufzurufen, so wie es war, als setInterval deklariert wurde. Wenn setInterval deklariert wurde, gab es eine Variable namens giveword mit der Methode showWord(), die den Wert Ihrer ursprünglichen Eingabe zurückgibt. (Verschlüsse sind schwer zu erklären, und ich fürchte, Sie würden am besten von jemandem gedient, der sie erklärt, wenn Sie weitere Informationen benötigen.)

+0

Hey, es ist eine schöne und klare Erklärung für mich, danke! –