Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   [Closure Compiler] Как запретить инлайнить функцию, которая вызывается из setTimeout? (https://javascript.ru/forum/events/15056-%5Bclosure-compiler%5D-kak-zapretit-inlajjnit-funkciyu-kotoraya-vyzyvaetsya-iz-settimeout.html)

xintrea 11.02.2011 13:57

[Closure Compiler] Как запретить инлайнить функцию, которая вызывается из setTimeout?
 
Здравствуйте!


Сейчас разбираюсь с Google Closure Compiler

http://code.google.com/p/closure-compiler/.
http://javascript.ru/optimize/google-closure-compiler

И наткнулся на такую проблему. Основной цикл JavaScript-программы организуется через функцию mainLoop() примерно следующего содержания:

Код:

// Основной цикл
function mainLoop()
{
 var refresh_rate=10;
 var start_msec = (new Date()).getMilliseconds();

 // Главный обработчик игры
 lb_tv.update();

 var stop_msec = (new Date()).getMilliseconds();
 var diff_msec = stop_msec - start_msec;

 if(diff_msec > refresh_rate)
  setTimeout("mainLoop()",1);
 else
  if(diff_msec < 0)
  {
    //this is a fix for a weird situation where the diff is a large
    // negatif value --> TO INVESTIGATE LATER
    setTimeout("mainLoop()",refresh_rate);
  }
  else setTimeout("mainLoop()",(refresh_rate-diff_msec));
}

Функция mainLoop() один раз вызывается из программы, потом по таймеру сама себя запускает.

Проблема в том, что Closure Compiler удаляет весь код функции mainLoop() и делает inline-вставку всего кода этой функции на месте, где происходит вызов. В результате, вызов setTimeout("mainLoop()",1); не работает, так как функции нет. И как предотварить это преобразование функкции в inline-код я не могу понять.

От прописывания в екстерны имени mainLoop() никакого толку нет - функция не переименовывается, она именно исчезает.

Пробовал не заключать в кавычки имя "mainLoop()". Тогда функция не инлайнится, то есть вроде как Closure Compiler видит, что функция использует возов свебя. Но ни Opera 11, ни Firefox 3.6 не понимают такой записи.

Что делать?

Kolyaj 11.02.2011 14:05

setTimeout(mainLoop,1);

B@rmaley.e><e 11.02.2011 14:08

http://alljs.ru/articles/timeout/overview.html

Маэстро 11.02.2011 14:11

С Closure Compiler не работатал, но попробуйте вместо
setTimeout("mainLoop()",refresh_rate);

написать более грамотный вариант:
setTimeout(function() {mainLoop()}, refresh_rate);

xintrea 11.02.2011 16:23

Заработало, что-то не заметил я что скобки не нужны.


Часовой пояс GMT +3, время: 22:03.