SetTime: примеры (JAVASCRIPT)
setTime(timeValue: Number): Number (milliseconds)Функция setTimeout в JavaScript
Функция setTimeout() является частью Web API и среды выполнения JavaScript, позволяющей отложить выполнение кода на указанное время. Она применяется для создания задержек, асинхронного выполнения задач, реализации таймаутов или периодических проверок.
Синтаксис функции: let timeoutID = setTimeout(function[, delay, arg1, arg2, ...]); или let timeoutID = setTimeout(code[, delay]);.
- function/code: Функция или строка кода для выполнения. Использование строк не рекомендуется из-за проблем с безопасностью и производительностью.
- delay: Необязательная задержка в миллисекундах перед выполнением. По умолчанию 0. Фактическое время может быть больше из-за механизма цикла событий.
- arg1, arg2, ...: Необязательные аргументы, передаваемые в функцию.
Функция возвращает числовой идентификатор таймера (timeoutID), который можно использовать для отмены с помощью clearTimeout(). Возвращаемое значение не является таймером в объектном смысле.
Примеры использования setTimeout
Базовый вызов с функцией и задержкой:
setTimeout(() => {
console.log('Сообщение через 2 секунды');
}, 2000);// Через 2 секунды в консоли: // Сообщение через 2 секунды
Передача аргументов в отложенную функцию:
function greet(name, punctuation) {
console.log(`Привет, ${name}${punctuation}`);
}
setTimeout(greet, 1000, 'Анна', '!');// Через 1 секунду в консоли: // Привет, Анна!
Вызов с нулевой задержкой:
console.log('Начало');
setTimeout(() => {
console.log('Код с нулевой задержкой');
}, 0);
console.log('Конец');// В консоли сразу: // Начало // Конец // Код с нулевой задержкой
Похожие функции в JavaScript
- setInterval(): Выполняет код повторно с заданным интервалом. Используется для периодических действий, например, обновления данных. Требует явной остановки с помощью
clearInterval(). - requestAnimationFrame(): Синхронизирует выполнение функции с обновлением экрана браузера. Оптимален для анимации, обеспечивая плавность и экономию ресурсов.
- queueMicrotask(): Планирует выполнение микротаски. Подходит для задач, которые должны быть выполнены сразу после текущего синхронного кода, но перед любыми макротасками (включая setTimeout).
- Promise.then() и async/await: Позволяют работать с асинхронными операциями без явных таймеров, но могут комбинироваться с
setTimeoutдля создания задержек внутри асинхронного потока.
Типичные ошибки
Потеря контекста this:
const obj = {
value: 'test',
show() {
setTimeout(function() {
console.log(this.value);
}, 100);
}
};
obj.show();// Выведет: undefined // Решение: использование стрелочной функции или bind.
Использование строки вместо функции:
setTimeout("console.log('Запущено')", 500);
// Код выполнится, но такой подход устарел и опасен.// Через 500 мс выведет: // Запущено
Накопление колбэков при вложенных вызовах:
function recursiveTimeout() {
setTimeout(() => {
console.log('Вызов');
recursiveTimeout();
}, 100);
}
recursiveTimeout();
// При частых вызовах возможны проблемы с памятью, если не контролировать остановку.Изменения в последних версиях
Функция setTimeout является устоявшейся частью API и не претерпела значительных изменений в спецификациях ECMAScript. Однако, среда выполнения Node.js добавила дополнительные параметры в версии 10.0.0, такие как передача аргументов для колбэка. В браузерах улучшения касаются в основном внутренней оптимизации и интеграции с механизмом цикла событий. Также в современных стандартах рекомендуется избегать использования строки кода в качестве первого аргумента из-за соображений безопасности.
Расширенные примеры
Создание таймаута для Promise:
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function example() {
console.log('Начало ожидания');
await delay(1500);
console.log('Ожидание завершено');
}
example();// Сразу: // Начало ожидания // Через 1.5 секунды: // Ожидание завершено
Реализация дебаунсинга:
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
// Использование:
window.addEventListener('resize', debounce(() => {
console.log('Размер окна изменен');
}, 300));Рекурсивный setTimeout для точного интервала:
let counter = 0;
function repeat() {
console.log(`Вызов ${++counter}`);
if (counter < 5) {
setTimeout(repeat, 1000);
}
}
setTimeout(repeat, 1000);// Каждую секунду: // Вызов 1 // Вызов 2 // ...
Отмена таймера:
const timerId = setTimeout(() => {
console.log('Это не выполнится');
}, 2000);
clearTimeout(timerId);
console.log('Таймер отменен');// Сразу: // Таймер отменен
Аналоги функции в других языках
Python (модуль threading):
import threading
def delayed_task():
print('Задача выполнена')
timer = threading.Timer(2.0, delayed_task)
timer.start()# Через 2 секунды выводит: # Задача выполнена
PHP:
sleep(2); // Останавливает выполнение скрипта на 2 секунды
echo 'Задача выполнена';
// Или для асинхронности можно использовать расширения, например, swoole.// После 2 секунд задержки: // Задача выполнена
C (Windows API):
#include
Sleep(2000); // Останавливает поток на 2000 миллисекунд
printf("Задача выполнена\n"); // После 2 секунд задержки: // Задача выполнена
MySQL:
SELECT SLEEP(2); // Приостанавливает выполнение запроса на 2 секунды// Запрос вернет результат после задержки.