Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   не работает setTimeout в userjs (https://javascript.ru/forum/css-html-firefox-mizilla/14942-ne-rabotaet-settimeout-v-userjs.html)

alxcube 06.02.2011 19:53

не работает setTimeout в userjs
 
Здравствуйте! Пишу скрипт для проверки личных сообщений на форуме. почему-то отказывается работать setTimeout. буду благодарен за помощь.
function idf_timer(set_tmr)
{
    var tmr_counter=set_tmr;
    if (tmr_counter>=30) {tmr_counter=0; CheckForMessages();}
    else tmr_counter++;
    setTimeout("idf_timer("+tmr_counter+")",1000);
}

NoResponse 07.02.2011 07:54

если не ошибаюсь, надо так:
setTimeout(function(){idf_timer(tmr_counter)},1000 );
...
а вообще я бы все это заменил одной строкой
setInterval("CheckForMessages()",30000);

killer8080 07.02.2011 11:11

скорее так:
setTimeout((function(tmr_counter){return function(){idf_timer(tmr_counter)}})(tmr_counter), 1000);
но с интервалами решение красивее.

B@rmaley.e><e 07.02.2011 11:22

Если передать аргументом setTimeout (и setInterval) строку, то код внутри нее будет выполнен в глобальном контексте. А все юзерскрипты, если мне не изменяет память, по-умолчанию выполняются в своем собственном локальном контексте. Отсюда - функции idf_timer и CheckForMessages не существуют в глобальном контексте.

alxcube 07.02.2011 15:10

спасибо. а причину указать не могли бы? потому что в опере этот код прекрасно работает...

B@rmaley.e><e 07.02.2011 15:21

Видимо, в опере юзерскрипты все-таки выполняются в глобальном контексте. В любом случае засорение глобального пространства имен - плохой тон, и его лучше избегать. Как и строковых аргументов для setTimeout / setInterval, потому что eval - зло (А для преобразования строки в код будет использован именно он).

alxcube 08.02.2011 17:28

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 91457)
Видимо, в опере юзерскрипты все-таки выполняются в глобальном контексте. В любом случае засорение глобального пространства имен - плохой тон, и его лучше избегать. Как и строковых аргументов для setTimeout / setInterval, потому что eval - зло (А для преобразования строки в код будет использован именно он).

когда пробовал не строкой, то опера начинала жутко тормозить


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