2010-05-12 7 views
19
window.addEventListener('unload', function(e) 
{ 
    MyClass.shutdown(); 
    window.removeEventListener('unload', /* how to refer to this function? */); 
}, false); 
+1

bitte später Frage Titel verbessern für die Suche –

Antwort

20

Namen Ihrer Funktion.

function f(e) { 
    MyClass.shutdown(); 
    window.removeEventListener('unload', f); 
} 
window.addEventListener('unload', f, false); 

bearbeiten ich denke, das wird auch funktionieren. Guter Punkt Kobi!

+0

Nun, ich bin mir dessen bewusst, aber ich möchte die anonyme Funktion nicht umbenennen ... Ich mag es so wie es jetzt ist. – Pablo

+3

@Michael - die Funktion kann lokal benannt werden, innerhalb ihrer Schließung. Es ist eine kleine Veränderung. – Kobi

+3

@Michael: Benennen Sie Ihre Funktion ist bei weitem * der beste Weg, um sich selbst zu nennen. Die Verwendung von 'arguments.callee' ist bei den meisten aktuellen Implementierungen (zwischen 2x und 10x - ja, wirklich) dramatisch langsamer und wird nicht mit dem neuen" strict mode "von ECMAScript funktionieren (mit dem Sie vielleicht anfangen möchten, es zu verwenden) Irgendwann). Der Performance-Aspekt spielt nun keine Rolle mehr, wenn Sie einen 'Onload'-Handler aushängen, sondern nur darauf hinweisen, falls Sie das Pattern an anderer Stelle anwenden. –

11

Howto Verwendung der Rekursion auf Anonyme Funktionen

Können sagen wir eine anonyme Fakultäts-Funktion haben, und wir wollen, dass es rekursiv tun. Wie nennen wir eine Funktion ohne Namen? Nun, in JavaScript enthält die Eigenschaft arguments.callee einen Zeiger auf die gerade ausgeführte Funktion, was bedeutet, dass sich eine anonyme Funktion tatsächlich selbst aufrufen kann.

alert((function(n){ if(n <= 1){return 1;}else{return n*arguments.callee(n-1);}})(10)); 

Quelle: http://www.hunlock.com/blogs/Functional_Javascript

+2

so wäre es nur 'window.removeEventListener ('entladen', arguments.callee) '? – Pablo

+0

@Michael: Mit zwei "l" s, aber ja. Aber im Allgemeinen ist das kein guter Weg; Siehe meinen Kommentar zu Ykaganovichs Antwort. –

+1

Das ist die Antwort! Ich wünschte wirklich, dass dies gewählt würde anstelle des aktuellen. –

1

Ich habe das nicht versucht, aber wie wäre es, den RemoveEventListener-Methodenaufruf in MyClass selbst zu verschieben. Die Methode wird nicht anonym sein, aber Sie werden den globalen Namespace nicht verschmutzen, und sie wird Teil der Klasse sein, die sie manipuliert. Sie können es sogar "privat" machen. Ich bin nicht sicher, was Ihr Stil ist, aber ich würde es so etwas schreiben:

var MyClass = function(){ 
    var self = this; 
    self.shutdown = function(){ 
    window.removeEventListener('unload',self.shutdown,false); 
    }; 
    self.initialize = function() { 
    window.addEventListener('unload',self.shutdown,false); 
    }; 
    return self; 
}; 
var myObject = new MyClass(); 
myObject.initialize(); 

Ich denke, es hängt davon ab, was MyClass tut und wie Sie es verwenden.

2

Die callee Eigenschaft des arguments Objekt immer an die aufgerufene Funktion verweist:

window.addEventListener('unload', function(e) 
{ 
    MyClass.shutdown(); 
    window.removeEventListener('unload', arguments.callee); 
}, false); 

See: MDC: callee

Verwandte Themen