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

Por favor, mejorar el título de pregunta para más tarde buscar –

Respuesta

20

Nombre de su función.

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

Editar creo que esto funcionará también. Buen punto Kobi!

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

bueno, soy consciente de eso, pero no quiero cambiar la función anónima a nombrada ... Me gusta como está ahora. – Pablo

+3

@Michael: la función se puede nombrar localmente, dentro de su cierre. Es un pequeño cambio. – Kobi

+3

@Michael: Nombrar su función es * por mucho * la mejor manera de permitirse llamarlo. El uso de 'arguments.callee' es dramáticamente más lento en la mayoría de las implementaciones actuales (entre 2x y 10x - sí, realmente), y no funcionará con el nuevo" modo estricto "de ECMAScript (que puede encontrar que desea comenzar a usar en algún punto). Ahora, el aspecto de rendimiento no es importante para desenganchar un controlador 'onload', sino solo señalarlo en caso de que aplique el patrón en otro lugar. –

11

uso Howto recursividad en funciones anónimas

digamos que tenemos una función factorial anónima y queremos hacerlo de forma recursiva. ¿Cómo llamamos a una función sin un nombre? Bueno, en Javascript, la propiedad arguments.callee contiene un puntero a la función que se está ejecutando actualmente, lo que significa que una función anónima puede llamarse a sí misma.

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

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

+2

por lo que sería simplemente 'window.removeEventListener ('descargar', arguments.calee) '? – Pablo

+0

@Michael: con dos "l" s, pero sí. Pero en * general * no es una buena manera de hacerlo; ver mi comentario sobre la respuesta de ykaganovich. –

+1

¡Esta es la respuesta! Realmente desearía que esto fuera elegido en lugar del que está actualmente. –

1

No he probado esto, pero ¿qué hay de mover el método removeEventListener llamada MiClase en sí mismo. El método no será anónimo, pero no estará contaminando el espacio de nombres global y será parte de la clase que está manipulando. Incluso puedes hacerlo "privado". No estoy seguro de cuál es tu estilo, pero me gustaría escribir algo como esto:

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

supongo que depende de lo que haga MiClase y cómo lo usa.

2

El callee propiedad del objeto argumentssiempre se refiere a la función llamada:

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

Ver: MDC: callee

Cuestiones relacionadas