обратный вызов setTimeout получает «случайное число» в качестве параметра? - PullRequest
2 голосов
/ 22 марта 2011

Сегодня я делал цикл с помощью setTimeout ().К сожалению, некоторые параметры функции получали странные значения.

Короче говоря, это то, что происходит:

var x = 1;
var steps = 3;
var timer = false;

function myFunc( y ){
   if( !isNaN(y)&&parseInt(y)==y&&y>0 ) { // if y is int and greater than 0
     x = y;
   } else { // y is no int or is below 0
     if( x >= steps ) { // x is greater than or equal to steps, return to first step
      x = 1
     } else { // x is less than steps, add 1
      x++;
     }
   }

   window.clearTimeout( timer );

   timer = setTimeout( myFunc, 1000 );
}

Теперь каким-то образом мистер Firefox случайным образом бросает int, гораздо больше, чем "шаги"в параметр" y "при запуске таймера ... ПОЧЕМУ он это делает?

Я решил эту проблему, просто сделав это:

timer = setTimeout( function(){ myFunc( -1 ) }, 1000 );

Но все же ..ПОЧЕМУ браузер выдавал случайные числа в параметре "y"?

Кто-нибудь?

Ответы [ 3 ]

5 голосов
/ 22 марта 2011

Firefox будет вызывать функцию с количеством миллисекунд, «запаздывающих» при выполнении функции.

1 голос
/ 22 марта 2011

Примечание: Gecko передает дополнительный параметр к процедуре обратного вызова, указывая «опоздание» тайм-аута в миллисекунды.

Источник: https://developer.mozilla.org/en/DOM/window.setTimeout#Syntax

Бесконечный цикл?

var x = 0,
steps = 3,
timer = false;

(function myFunc(y)
{
    x = y % steps;

    timer = setTimeout(myFunc, 1000, ++x);
})(0);
1 голос
/ 22 марта 2011

В качестве подсказки вы также можете просто использовать setInterval для достижения той же базовой функциональности:

var x = 1;
var steps = 3;
var timer = false;

function myFunc( y ){
    if (parseFloat(y) == parseInt(y) && !isNaN(y) && y > 0) {
        x = y;
    } else if (x >= steps) {
        x = 1;
    } else {
        x++;
    }
}


timer = window.setInterval(function() { 
    myFunc(1); 
}, 1000);
...