Разница возникает из-за различий в коде между двумя браузерами.
- Если вы измените порядок запуска интервалов и таймеров тайм-аута, Chrome будет работать так же, как Firefox:
"use strict";
var start = Date.now()
setTimeout(function timeout() { // start the timeout first
clearInterval(id)
console.log('timeout',Date.now() - start)
}, 400)
var id = setInterval(function interval() {
var whileStart = Date.now()
console.log(whileStart - start)
while (Date.now() - whileStart < 250) {
}
}, 100)
Если вы сохраняете тот же порядок, что и в посте, но уменьшаете блокировку, скажем, до 50 миллисекунд, интервал вызывается с отметкой 400 мс в Chrome и блокирует время ожидания, пока он блокирует цикл обработки событий.Но в Firefox setTimeout для 400 мс вызывается первым, очищает таймер интервала и вообще не вызывает таймер интервала при отметке 400 мс.
Короче говоря, обработка тайм-аутов для интервалов и таймеров кодируется по-разномув двух браузерах и в случае 2 выше Firefox добавляет 10 мс к интервалу между вызовами с интервальным таймером (как это разрешено в разделе 7.5 HTML 5.2 ).