Вызов метода анонимной функции Javascript по таймеру - PullRequest
2 голосов
/ 19 января 2012

Я работаю над созданием фейерверк-шоу в javascript для моего завтрашнего рабочего дня, и у меня возникли некоторые проблемы с его автоматизацией.Я использую найденный фейерверк здесь , и он отлично работает, но это будет на веб-странице статуса, которую я разработал некоторое время назад, поэтому я хочу, чтобы фейерверк был автоматическим, а не по щелчку.

Я создал функцию на странице fireworks.js, которая выглядит следующим образом ...

function fireFireworks(){
    var num = Math.floor(Math.random()*3) + 1;
    for(i=0;i<num;i++){
        createFirework();
    }
}

Это будет использоваться для запуска от 1 до 3 фейерверков при вызове.Затем я настраиваю

setInterval('fireFireworks()', 5000);

Когда оба они определены в моем локальном файле, а не в файле fireworks.js, я получаю неверную ссылку на createFirework().

Так что я переместилfireFireworks() прямо под функцию инициализации в fireworks.js, и тогда я получу неверную ссылку на fireFireworks(), поэтому я переместил setInterval в функцию intialize, но я все еще получаю неправильную ссылку на fireFireworks().

Однако, если я изменяю подшивку для onmouseup из document.addEventListener ('mouseup', createFireworks, true);to document.addEventListener ('mouseup', fireFireworks, true);

Он успешно создает несколько моих фейерверков.

Я предполагаю, что область действия setInterval играет здесь роль.Если бы кто-нибудь мог дать мне представление о том, как я мог бы автоматизировать это, а также некоторую информацию о том, почему моя установка не работает, я был бы очень признателен!

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Лучше передать саму функцию на setInterval, то есть

setInterval (fireFireworks, 5000)

Что касается области видимости, если ваша функция createFireworks нигде больше не используется, просто поместите ее внутри fireFireworks и вам больше не нужно об этом беспокоиться (как правило, в любом случае это лучше делать, потому что это предотвращает загрязнение глобальной области видимости).

В противном случае оберните обе функции взакрытие:

(function ()
{
    function fireFireworks ()
    {
        /* ... */
    }

    function createFirework ()
    {
        /* ... */
    }

    setInterval (fireFireworks, 5000)

}) ();
0 голосов
/ 20 января 2012

Попробуйте это:

(function(global){
    var theShow = {},
        createFirework;

    createFirework = function() {
    };    

    theShow.fireFireworks = function() {
        var num = Math.floor(Math.random()*3) + 1,
            i = 0;
        for(i;i<num;i++){
            createFirework();
        }
    };
   global.setInterval(theShow.fireFireworks , 5000);
   global.theShow = theShow;
}(window));

Теперь вы сможете вызывать theShow.firFireworks() из любого кода JavaScript в вашем приложении, если только он вызывается после вызова этого кода. Надеюсь, это поможет.

0 голосов
/ 19 января 2012

Вы используете функцию setInterval () таким образом, что портите вашу область видимости (используя строку).Попробуйте добавить к вашей функции инициализации:

 var fireworksTimer = setInterval(fireFireworks, 5000); 

, тогда, если вы сделаете fireFireworks "публичной" функцией,

 fireFireworks = function(){
      ....
 }

в отдельном файле js, она должна теперь вызываться.

...