Показать сообщение отдельно
  #1 (permalink)  
Старый 11.02.2011, 13:57
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

[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 не понимают такой записи.

Что делать?
Ответить с цитированием