Существует два (в основном используемых) типа функции таймера в javascript setTimeoutи setInterval( другое )
Оба эти метода имеют одинаковую подпись. Они принимают функцию обратного вызова и время задержки в качестве параметра.
setTimeout выполняется только один раз после задержки, тогда как setInterval продолжает вызывать функцию обратного вызова после каждой задержки milisecs.
оба эти метода возвращают целочисленный идентификатор, который можно использовать для очистки их до истечения таймера.
clearTimeoutи clearIntervalоба эти метода принимают целочисленный идентификатор, возвращенный из вышеуказанных функций setTimeoutиsetInterval
Пример:
SetTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
Если вы запустите приведенный выше код, вы увидите, что он предупреждает, before setTimeoutа затем, after setTimeoutнаконец, он предупреждаетI am setTimeout через 1сек (1000 мс)
Из этого примера вы можете заметить, что setTimeout(...)он асинхронный, что означает, что он не ожидает истечения таймера, прежде чем перейти к следующему выражению, т.е.alert("after setTimeout");
Пример:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
Если вы запустите приведенный выше код, вы увидите, что он предупреждает, before setIntervalа затем, after setIntervalнаконец, он предупреждает I am setInterval 5 раз через 1 с (1000 мс), потому что setTimeout сбрасывает таймер через 5 секунд, а в противном случае каждую 1 секунду вы будете получать оповещение I am setIntervalбесконечно.
Как внутренний браузер это делает?
Я объясню вкратце.
Чтобы понять, что вы должны знать об очереди событий в JavaScript. В браузере реализована очередь событий. Всякий раз, когда событие запускается в js, все эти события (например, щелчок и т. Д.) Добавляются в эту очередь. Когда вашему браузеру нечего выполнять, он берет событие из очереди и выполняет их одно за другим.
Теперь, когда вы звоните setTimeoutилиsetInterval ваш обратный вызов регистрируется в таймере в браузере, он добавляется в очередь событий по истечении заданного времени, и в конечном итоге javascript берет событие из очереди и выполняет его.
Это происходит так, потому что движок javascript является однопоточным и может выполнять только одну вещь за раз. Таким образом, они не могут выполнять другие JavaScript и отслеживать ваш таймер. Вот почему эти таймеры зарегистрированы в браузере (браузер не является однопоточным), и он может отслеживать таймер и добавлять событие в очередь после истечения таймера.
то же самое происходит, setIntervalтолько в этом случае событие снова и снова добавляется в очередь по истечении заданного интервала, пока оно не будет очищено или страница браузера обновлена.
Заметка
Параметр задержки, который вы передаете этим функциям, является минимальным временем задержки для выполнения обратного вызова. Это связано с тем, что после истечения времени таймера браузер добавляет событие в очередь, которая будет выполняться механизмом javascript, но выполнение обратного вызова зависит от вашей позиции событий в очереди, и, поскольку механизм является однопоточным, он выполнит все события в очередь по очереди.
Следовательно, ваш обратный вызов может иногда требовать больше, чем указанное время задержки, чтобы вызываться специально, когда ваш другой код блокирует поток и не дает ему времени для обработки того, что находится в очереди.
И, как я уже упоминал, javascript - это один поток. Так что, если вы заблокируете поток на долго.
Как этот код
while(true) { //infinite loop
}
Ваш пользователь может получить сообщение о том, что страница не отвечает .
setTimeout(function(){/*YourCode*/},1000);