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

s'il vous plaît améliorer le titre de question pour la recherche plus tard –

Répondre

20

Nom de votre fonction.

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

Modifier Je pense que cela fonctionnera aussi. Bon point Kobi!

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

Eh bien je suis au courant de celui-là, mais je ne veux pas changer la fonction anonyme à nommé ... J'aime la façon dont il est maintenant. – Pablo

+3

@Michael - la fonction peut être nommée localement, dans sa fermeture. C'est un petit changement. – Kobi

+3

@Michael: Nommer votre fonction est * de loin * la meilleure façon de vous permettre de l'appeler. L'utilisation de 'arguments.callee' est considérablement plus lente sur la plupart des implémentations actuelles (entre 2x et 10x - oui, vraiment), et ne fonctionnera pas avec le nouveau" mode strict "d'ECMAScript (que vous pouvez commencer à utiliser sur quelque point). Maintenant, l'aspect performance n'a pas d'importance pour décrocher un gestionnaire 'onload', mais juste le signaler au cas où vous appliqueriez le pattern ailleurs. –

11

récursion Howto utilisation sur les fonctions anonymes

Disons que nous avons une fonction factoriel anonyme et nous voulons le faire de manière récursive. Comment appelons-nous une fonction sans nom? Bien en Javascript, la propriété arguments.callee contient un pointeur sur la fonction en cours d'exécution, ce qui signifie qu'une fonction anonyme peut, en effet, s'appeler elle-même.

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

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

+2

il serait donc juste 'window.removeEventListener ('décharger', arguments.calee) '? – Pablo

+0

@Michael: Avec deux "l" s, mais oui. Mais en général, ce n'est pas un bon moyen de le faire; voir mon commentaire sur la réponse de ykaganovich. –

+1

Ceci est la réponse! Je souhaite vraiment que ce soit choisi à la place de celui qui est actuellement. –

1

Je ne l'ai pas essayé, mais que diriez-vous déplacer la méthode removeEventListener appel en MyClass lui-même. La méthode ne sera pas anonyme, mais vous ne polluerez pas l'espace de noms global et il fera partie de la classe qu'il manipule. Vous pouvez même le rendre "privé". Je ne suis pas sûr de ce que votre style est, mais je l'écris quelque chose comme ceci:

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(); 

Je suppose que cela dépend de ce que MyClass fait et comment vous l'utilisez.

2

La callee propriété du arguments objet toujours fait référence à la fonction appelée:

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

Voir: MDC: callee

Questions connexes