JavaScript: как очистить неглобальный (закрытый) setTimeout? - PullRequest
5 голосов
/ 08 мая 2011

Я стараюсь быть хорошим гражданином и стараюсь как можно больше выходить за рамки глобальных возможностей.Есть ли способ получить доступ к переменным setTimeout, которые не входят в глобальную область видимости?

Чтобы в этом примере кто-то отменил 'timer'?

myObject.timedAction = (function(){
    var timer;
        return function(){
            // do stuff

            // then wait & repeat       
            timer = setTimeout(myObject.timedAction,1000);
        };
})();

Я пытался clearTimeout(myObject.timedAction.timer,1000); (без успеха), и не уверен, что еще попробовать.

Ответы [ 3 ]

4 голосов
/ 08 мая 2011

Вы не можете, если у вас нет ссылки на timer, чего нет, потому что вы объявляете ее как переменную в области видимости. Вы можете сделать что-то вроде:

myObject.timedAction = (function(){
    return function(){
        // do stuff

        // then wait & repeat       
        myObject.timedAction.timer = setTimeout(myObject.timedAction,1000);
    };
})();

clearTimeout(myObject.timedAction.timer);

Обратите внимание, что приведенный выше код разрешает только один таймер. Если вам нужны ссылки на более чем один таймер, его необходимо настроить.

3 голосов
/ 08 мая 2011

Все дело в том, что внутренние переменные являются приватными и недоступными для внешнего мира. Так что вы должны немного изменить свой подход:

myObject.timedAction = (function(){
    var timer;
    var result = function(){
        // do stuff
        // then wait & repeat       
        timer = setTimeout(myObject.timedAction,1000);
    };

    result.cancel = function() {
        clearTimeout(timer);
    };

    return result;
})();

myObject.timedAction();       // start it
myObject.timedAction.cancel() // end it

Так что теперь таймер доступен только изнутри крышки. И да, вы можете добавлять методы в функцию, потому что JS потрясающий.

1 голос
/ 08 мая 2011

Поместите ручку таймера в свойство вашего объекта:

myObject.timedAction = function(){
  // do stuff
  // then wait & repeat
  this.timer = window.setTimeout(function(){ myObject.timedAction(); },1000);
};

Обратите внимание, что вы должны обернуть вызов из таймера в функцию, чтобы он вызывался как метод вашего объекта, а не как глобальная функция, иначе вы не сможете получить доступ к своему объекту с помощью this.

Теперь вы можете остановить таймер, используя:

window.clearTimeout(myObject.timer);
...