Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 не понимают такой записи.

Что делать?
Ответить с цитированием
  #2 (permalink)  
Старый 11.02.2011, 14:05
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

setTimeout(mainLoop,1);
Ответить с цитированием
  #3 (permalink)  
Старый 11.02.2011, 14:08
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

http://alljs.ru/articles/timeout/overview.html
Ответить с цитированием
  #4 (permalink)  
Старый 11.02.2011, 14:11
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

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

написать более грамотный вариант:
setTimeout(function() {mainLoop()}, refresh_rate);
Ответить с цитированием
  #5 (permalink)  
Старый 11.02.2011, 16:23
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск