JavaScript - Передача ссылки на эту текущую анонимную функцию - PullRequest
19 голосов
/ 12 мая 2010
window.addEventListener('unload', function(e)
{
    MyClass.shutdown();
    window.removeEventListener('unload', /* how to refer to this function? */);
}, false);

Ответы [ 4 ]

21 голосов
/ 12 мая 2010

Назовите вашу функцию.

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

Редактировать Я думаю, это тоже будет работать. Хороший вопрос, Коби!

window.addEventListener('unload', function f(e)
{
    MyClass.shutdown();
    window.removeEventListener('unload', f);
}, false);
11 голосов
/ 12 мая 2010

Как использовать рекурсию для анонимных функций

Допустим, у нас есть анонимная факториальная функция, и мы хотим сделать это рекурсивно. Как мы вызываем функцию без имени? В 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 голосов
/ 12 мая 2010

Свойство callee объекта arguments всегда относится к вызываемой функции:

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

См .: MDC: вызываемый

1 голос
/ 12 мая 2010

Я не пробовал это, но как насчет перемещения вызова метода 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 и как вы его используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...