SetTime: примеры (JAVASCRIPT)

Использование функции setTimeout в 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:

Пример javascript
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function example() {
  console.log('Начало ожидания');
  await delay(1500);
  console.log('Ожидание завершено');
}
example();
// Сразу:
// Начало ожидания
// Через 1.5 секунды:
// Ожидание завершено

Реализация дебаунсинга:

Пример javascript
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 для точного интервала:

Пример javascript
let counter = 0;
function repeat() {
  console.log(`Вызов ${++counter}`);
  if (counter < 5) {
    setTimeout(repeat, 1000);
  }
}
setTimeout(repeat, 1000);
// Каждую секунду:
// Вызов 1
// Вызов 2
// ...

Отмена таймера:

Пример javascript
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 секунды
// Запрос вернет результат после задержки.

JS setTime function comments

En
SetTime Sets the Date object to the time represented by a number of milliseconds since January 1, 1970, 00:00:00 UTC