Короткая справка по setTimeout()
handle = self . setTimeout( handler [, timeout [, arguments... ] ] )
Планирует тайм-аут для запуска обработчика после тайм-аута в миллисекундах. Любые аргументы передаются непосредственно обработчику.
handle = self . setTimeout( code [, timeout ] )
Планирует тайм-аут для компиляции и запуска кода после тайм-аута в миллисекундах.
Метод setTimeout() должен возвращать значение, возвращаемое этапами инициализации таймера, передавая им аргументы метода, объект, на котором реализован метод, для которого выполняется алгоритм (объект Window или WorkerGlobalScope) в качестве "контекста метода", и флаг "повторения" установлен в значение false.
Минимальный набор для работы.
Мы создадим две функции. Первая будет ДЕЛАТЬ, а вторая будет ЗАПУСКАТЬ ПО ТАЙМЕРУ первую. По сути вторая ничего сама не делает - никак не влияет на данные. Вторая функция обеспечивает всей программе ОТЛОЖЕННОСТЬ (АСИНХРОННОСТЬ), которую не может дать интерпретатор кода JavaScript.
То есть setTimeout - это не фундаментальная конструкция стандарта ECMAScript, по которому работает JavaScript. В нашем случае setTimeout - это просто "Браузерный API" - это функция браузерного прикладного интерфейса программирования "WindowOrWorkerGlobalScope mixin", которая входит в состав стандарта HTML, описанного в консорциуме "whatwg.org". Миксин WindowOrWorkerGlobalScope предназначен для использования API, которые должны быть представлены в объектах Window и WorkerGlobalScope.
Пример работы setTimeout() с таймером и функцией.
Напишем первую функцию nowDate, которая будет выводить в консоль текущую дату:
function nowDate () { console.log(Date()) }

Мы ОБЪЯВИЛИ функцию, но НЕ ЗАПУСТИЛИ её. (НЕ ВЫЗВАЛИ)
При попытке ВЫЗОВА функции nowDate() в консоль браузера будет немедленно выведена текущая дата. Мы пишем название функции и ставим круглые скобки - так мы ВЫЗЫВАЕМ её выполнение.
nowDate()

Напишем вторую функцию sleep5sec, которая будет совершать ОТЛОЖЕННЫЕ действия по заданному таймеру:
function sleep5sec () { setTimeout(nowDate, 5000) }

В этой функции мы будем на 5 секунд откладывать выполнение выведения текущей даты. То есть мы будем на 5 секунд ОТКЛАДЫВАТЬ ВЫЗОВ функции nowDate, которую ОБЪЯВИЛИ ранее.
В setTimeout() нам нужно передать два параметра:
- Ссылку на функцию обратного вызова (в нашем случае это nowDate). Просто название функции БЕЗ КРУГЛЫХ СКОБОК, потому что круглые скобки будут немедленно её вызывать и ТАЙМЕР НЕ БУДЕТ РАБОТАТЬ.
- Число миллисекунд, через которое передаваемая функция будет вызвана. В 1 секунде 1000 миллисекунд.
ВНИМАНИЕ!!! В setTimeout() мы передаём ТОЛЬКО ССЫЛКУ НА ФУНКЦИЮ. Круглые скобки НЕ НУЖНЫ. Убираем круглые скобки
Если в setTimeout() передать название функции с круглыми скобками, то она будет немедленно ВЫЗВАНА. Никакой асинхронности не будет заметно.
Что мы имеем на данный момент?
Сейчас у нас есть две функции (две небольшие программки). Их имена:
- nowDate
- sleep5sec
nowDate - При вызове. Мгновенно вернёт результат (данные).
sleep5sec - При вызове. Подождёт 5 секунд и вернёт результат (данные).
Что делать после объявления функций?
Интерпретатор получил наши функции - маленькие программы. Он знает как их будет выполнять.
Теперь нам нужно вызвать ту функцию, которая возвращает ОТЛОЖЕННЫЕ данные ... Нужно вызвать ту функцию, которая знает как выполнять другую функцию с временной задержкой ... Нужно вызвать ту функцию, которая в своём теле содержит setTimeout().
Мы вызываем sleep5sec(). Пишем название нашей функции и СТАВИМ КРУГЛЫЕ СКОБКИ.
sleep5sec()

Информационные ссылки
JavaScript | setTimeout() | Как передать параметры в функцию-обработчик?
Стандарт HTML (whatwg) - Таймеры - https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
Стандарт HTML (whatwg) - Миксин WindowOrWorkerGlobalScope - https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope-mixin
Стандарт HTML (whatwg) - Метод setTimeout() - https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
Стандарт ECMAScript - конструктор Date() - https://tc39.es/ecma262/#sec-date-constructor
Стандарт ECMAScript - Функции - https://tc39.es/ecma262/#sec-function-objects