Я сделал такой код:

window.setInterval(function(){ var a = doStuff(); var b = a + 5; }, 60000)

Фактическое содержание анонимной функции, конечно, только для этого небольшого примера, поскольку это не имеет значения. Что действительно происходит, так это то, что в области действия самой функции создается куча переменных, потому что я не хочу / не хочу загрязнять глобальное пространство.

Но, как вы все знаете, функция doStuff () не будет вызываться до 60 секунд на странице. Я также хотел бы вызвать функцию прямо сейчас, как только страница загрузится, и с тех пор каждые 60 секунд.

Можно ли как-то вызвать функцию без копирования / вставки внутреннего кода сразу после строки setInterval ()? Как я уже сказал, я не хочу загрязнять глобальное пространство бесполезными переменными, которые не нужны вне функции.

10
Tominator 3 Июн 2010 в 12:02

3 ответа

Лучший ответ

Вы можете поместить свою функцию обратного вызова в переменную и обернуть все в самовозглашающуюся анонимную функцию:

(function () {
    var callback = function() { 
        var a = doStuff(); 
        var b = a + 5; 
    };

    callback();

    window.setInterval(callback, 60000);
})();

Нет загрязнения.

16
Daniel Vassallo 3 Июн 2010 в 08:08

Еще одно решение:

(function() { 
    var a = doStuff(); 
    var b = a + 5; 
    window.setTimeout(arguments.callee, 60000);
})();

При этом вместо интервала используется тайм-аут, чтобы он мог запускаться в первый раз, а затем снова запускаться самостоятельно после тайм-аута.

0
DiverseAndRemote.com 28 Фев 2013 в 17:05

Это возможно и без создания глобальных переменных:

setInterval((function fn() {
 console.log('foo'); // Your code goes here
 return fn;
})(), 5000);

На самом деле, таким образом, вы вообще не создаете никаких переменных.

Однако в Internet Explorer функция fn станет доступной из окружающей области (из-за ошибки). Если вы не хотите, чтобы это произошло, просто оберните все в вызывающую себя анонимную функцию:

(function() {
 setInterval((function fn() {
  console.log('foo'); // Your code goes here
  return fn;
 })(), 5000);
})();

Благодарим Пола Айриша за поделиться этим трюком.


Изменить . В ответе добавлена дополнительная информация, благодаря bobince.

5
Community 23 Май 2017 в 11:48