2010-11-01 6 views
8

Ich habe diese Klasse/FunktionWie von einem Prototyp der Eltern diese Funktion ist innerhalb einer Methode für den Zugriff auf

function Menu() 
{ 
    this.closetimer = 0; 
    this.dropdown = 0; 
} 

Menu.prototype.menuTimer = function() 
{ 
    this.closetimer = setTimeout(function() 
    { 
    this.menuClose(); 
    }, this.timeout); 
} 

Menu.prototype.menuClose = function() 
{ 
    if(this.dropdown) this.dropdown.css('visibility','hidden'); 
} 

ich die Funktion menuClose() nennen wollen, die Teil der Menu-Klasse ist, aber ich denke, dieser Code tatsächlich versucht vom closetimer Objekt menuClose() aufrufen.

Wie referenziere ich menuClose() aus dem Menüobjekt aus menuTimer()?

Antwort

15

In Ihrem setTimeout() Rückruf bezieht sich this auf window, halten nur eine Referenz wie folgt aus:

Menu.prototype.menuTimer = function(){ 
    var self = this; 
    this.closetimer = setTimeout(function(){ 
     self.menuClose(); 
    }, this.timeout); 
} 
+0

doh! Vielen Dank! Gehirnfurz. – polyhedron

+0

@polyeder - welcome :) –

4

Sie einen Verweis auf das Menü (this) definieren, während Sie Zugriff darauf haben ..

Menu.prototype.menuTimer = function(){ 
    var _self = this; 
    this.closetimer = setTimeout(function(){ 
     _self.menuClose(); 
    }, this.timeout); 
} 
+0

Sie sollten 'var _self' verwenden, um Kollisionen mit dem globalen Namespace zu vermeiden. – MForster

+0

@MFoster, bereits korrigiert, danke :) trigger happy .. –

6

Eine andere Möglichkeit besteht darin, die innere Funktion zu binden.

Menu.prototype.menuTimer = function(){ 
this.closetimer = setTimeout(function(){ 
    this.menuClose(); 
}.bind(this), this.timeout); 
} 

Menu.prototype.menuTimer = function(){ 
this.closetimer = setTimeout(this.menuClose.bind(this), this.timeout); 
} 
+1

Könnte dies als 'setTimeout (this.menuClose.bind (this), this.timeout)' geschrieben werden? – MForster

+0

Sie haben absolut Recht und ich habe es aktualisiert, um zu zeigen. Es ist bei weitem die beste Lösung. Gib mir alle Stimmen! – clockworkgeek

+0

Das macht dich ein bisschen gierig klingen :-) – MForster

Verwandte Themen