Подтвердить что ты не робот

С чем вызвана функция, заданная для setTimeout?

У меня такой код:

setTimeout(foo, 600);

Я всегда думал, что foo не принимает никаких аргументов, например:

function foo() { /* bars */ }

Однако выполните следующие действия:

function foo(a) { alert(a); /* bars */ }

Появилось отображение предупреждения -7. Что представляет это число?

4b9b3361

Ответ 1

Это разность во времени (в миллисекундах) с того момента, когда было запланировано запустить ее и когда она действительно выполнялась.

alert(setTimeout(function(a) { alert(a) }, 2000));

Если вы очистите первое предупреждение вовремя, вы увидите следующее предупреждение: где-то от 10 до 10. Если вы подождете несколько секунд, вы увидите что-то, что находится примерно в то время, когда вы ждали минус 2000.

То же самое можно увидеть и для setInterval. Запустите в Firebug следующее:

setInterval(function(a) { alert(a); }, 2000);

Попытайтесь быстро закрыть оповещение, оно снова будет около 0. Оставьте его открытым - это даст вам большое значение.

Примечание. Это на Firefox Mac, где сохранение предупреждения открыто остановит обработку Javascript, поэтому таймер не выполняется, пока я не закрою предупреждение. Поведение вышеперечисленных тестов может отличаться в других браузерах

Ответ 2

Из того, что я могу сказать... аргумент в разнице между тем, когда он был запланирован, и когда он действительно выполнялся в миллисекундах. Интересно, кажется, что некоторые браузеры любят даже доли целых секунд...

<script>
var a = setInterval(foo, 125);

console.log(a);

function foo(b) {
 console.log(b);
}
</script>

выводит кучу нулей, то же самое касается 250, 500, 1000... while

<script>
var a = setInterval(foo, 127);

console.log(a);

function foo(b) {
 console.log(b);
}
</script>

выводит

 -2
12
-6
8
-10
4
2
0
-2
-4
9
-8
5
3
1