mozilla firefox и потайной параметр lateness

в ajax-приложениях часто бывает нужно выполнить некий запрос при инициализации, и потом повторять его каждые несколько секунд. Первый вызов иногда выполняет некоторые дополнительные действия, не нужные при последующих вызовах. Мне это удобно делать вот так:

function makeRequest(firstcall) {
    if (firstcall) { ... }
}

makeRequest(true);
setInterval(makeRequest, 10000);

однако в firefox этот код будет работать неожиданным образом — параметр firstcall будет задан при каждом вызове функции! В этом легко убедиться, выполнив на какой-нибудь странице код javascript:void(setTimeout(alert, 2000)).

увидев эти случайные числа в первый раз, я решил, что из-за бага firefox берёт мусор откуда-то из стека, и запостил тикет. Очень скоро выяснилось, что это это не баг: при вызове функции из setInterval/setTimeout firefox передаёт ей тайным, нигде не описанным параметром lateness величину задержки, с которой сработал таймер в этот раз. Это было добавлено в NN3, и ещё 9 (девять!) лет назад разработчики решили «ну пусть останется для совместимости». Я до сих пор думал, что семь лет — рекорд : )

за эти девять лет в документации не появилось ни слова об этой «фиче», а интернет (и багзилла) наполнились жалобами удивленных разработчиков. Но программисты мозиллы по-прежнему собираются добавить этот параметр в документацию, а потом и в стандарт, хотя редактор спеки html5 уже сказал, что в стандарте этого не будет.

ещё одна малопригодная особенность firefox, о которой нужно помнить : (

а вы говорите, opera...

Артемий Трегубенко,
,

pingbacks

  1. учу setTimeout хорошим манерам — software simian's typewritings

comments

  1. FF3, пишу в адрес-баре javascript:void(setInterval(alert, 3000)), получаю нули раз в три секунды. Что-то делаю не так?

    david_m,
  2. нули, а не undefined, как должно быть при вызове функции без параметра ; )

    arty,
  3. Логично… но всё-таки и не «случайные числа».

    david_m,
  4. у меня были случайные — видимо, под нагрузкой или ещё по какой-то причине, а у вас всё отрабатывало тютелька в тютельку : )

    arty,