Слишком много рекурсии

Рейтинг: 3Ответов: 1Опубликовано: 02.02.2011

Продолжаю свои крестовый поход в мир JavaScript. Столкнулся со следующей трудностью:

function stub(callback){
        var delay = Math.floor(Math.random()*10000)+1000;
        var msg = "Message " + delay;
        setTimeout(stub(callback), delay);
        callback(msg);
}

stub( function( msg ){ alert(msg); });

Выполняю в firefox и firebug показывает ошибку:

too much recursion: setTimeout(stub(callback), delay);

Как-нибудь это можно обойти? Вроде рекурсией и не пахнет, лишь бесконечный цикл :-)

UPD. Другой косяк заметил задержку стал варьировать от 10000 до 30000 миллисекунд. но что-то я не ощущаю этой задержки, в чем может быть проблема?)

Ответы

▲ 6Принят

Во-первых, вы неверно используете setTimeout. Вы передаёте в качестве первого параметра не функцию, а результат её выполнения. Это и приводит к тому, что нет задержки (в случае, если вы поменяли местами). А если всё так, как написано у вас, то вы вызываете stub из stub.. вот и получается рекурсия. (Вызываете stub, вместо того, чтобы сослаться на stub для вызова по таймауту).

UPD: Чтобы это победить, надо делать так:

function stub(callback){
    var delay = Math.floor(Math.random()*10000)+1000;
    var msg = "Message " + delay;

    setTimeout( function() {
        stub(callback); 
    }, delay);
    callback(msg);
}

stub( function( msg ) {
    alert(msg);
});

UPD2: "всё заработало" - это не верно. Просто показывается alert и вы закрываете, заходите опять в рекурсию и опять алёрт.. просто не успевает стек переполниться :)