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

请提高问题的称号,后来搜索 – 2010-05-12 05:06:53

回答

20

名称的功能。

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

编辑我想这也能工作。好点的Kobi!

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

以及我知道这一点,但我不想改变匿名函数命名...我喜欢现在的样子。 – Pablo 2010-05-12 05:09:42

+3

@Michael - 该函数可以在其关闭中进行本地命名。这是一个小小的改变。 – Kobi 2010-05-12 05:13:19

+3

@Michael:给你的函数命名是*迄今为止让你自己调用它的最好方法。在大多数当前实现中,使用'arguments.callee'的速度要慢得多(在2x和10x之间 - 是的,真的),并且不适用于ECMAScript的新“严格模式”(你可能会发现你想开始使用一点)。现在,性能方面对于取消挂载'onload'处理程序并不重要,但只要在其他地方应用模式时指出这一点即可。 – 2010-05-12 05:37:09

11

HOWTO使用递归的匿名函数

假设我们有一个匿名的阶乘函数,我们要递归做到这一点。我们如何调用没有名字的函数?在Javascript中,arguments.callee属性包含一个指向当前正在执行的函数的指针,这意味着一个匿名函数实际上可以调用它自己。

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

来源:http://www.hunlock.com/blogs/Functional_Javascript

+2

所以这将是刚刚'window.removeEventListener ('unload',arguments.calee)'? – Pablo 2010-05-12 05:07:18

+0

@迈克尔:有两个“l”,但是。但在*一般*这不是一个好办法;看到我对ykaganovich的回答的评论。 – 2010-05-12 05:38:56

+1

这就是答案!我真的希望这将被选择,而不是目前的。 – 2013-02-22 07:47:39

1

我没有试过,但如何移动removeEventListener方法调用到MyClass的本身。该方法不会是匿名的,但不会污染全局名称空间,它将成为它所操作的类的一部分。你甚至可以把它变成“私人”。我不知道你的风格是什么,但我会写这样的事:

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

我想这要看是什么MyClass的做,你如何使用它。

2

arguments对象总是指调用函数的callee属性:

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

参见:MDC: callee

相关问题