Сейчас боле менее складывается понимание (не буду придераться к используемым терминам, это не особо важно). Но ты слишком все усложняешь. Зачем тебе думать является ли setTimeout частью движка JavaScript или это часть Web API? Зачем тебе думать что попадает в стек, а что нет? Конечно же это хорошо, когда ты понимаешь, но в большинстве случаев это не надо вообще. Даже я не уверен, что понимаю что такое стек, и что вообще об этом когда-нибудь задумываюсь. До того, как начал изучать Си, я вообще о нем не думал.
Надо сильно упрощать все до уровня Есть или Нету. setTimeout отработал? Отработал. Значит он есть. useState отработала? Отработала. Значит она есть. Что тебе еще надо? Зачем тебе вот это чего частью оно является или нет? Не усложняй.
>> Здесь тоже мне не свосем понятно, когда функция useState попадает в стек при вызове, как сейчас или при инициализации она сразу попадает в стек и жет своего выполнения?
А что здесь не ясно? Ты же сам пишешь: "Инициализируем функцию setState". Вот как только инициировали, все, она есть. Доказательство тому - успешный вывод в любом месте за ее объявлением. К слову, Инициализация в данном случае - неправильное употребление. Инициализация - это объявление переменной сразу с задаваемым значением. А в данном случае у нас объявление функции. Функция сама по себе значения не имеет. И если переменную объявлять, но не задавать ей сразу значение, а присваивать значение позднее (пусть даже на следующей строчке), то это отдельно объявление, и позже присвоение. Здесь уже инициализации не будет. Начитался я тут всякого в книге по Си. Вот там это важно, там разное поведение в момент компиляции программы. А здесь нам это не нужно. Но на всякий случай уточнил.
Так вот, про объявление функции: еще раз: когда объявили, тогда она и есть. Но объявить - это не вызвать ее. То есть она не работает, ничего не читает и никаких значений не инициирует, пока ее не вызовут. Даже указав в аргументе значение по умолчанию, это значение будет или не будет использовано тогда, когда функция будет вызвана, а не когда функция объявлялась. И так будет каждый раз при вызове, в зависимости от того, какие параметры в нее передавались. При этом, когда мы вызываем функцию, у нас функция не висит, а выполняется, и возвращается ее результат. Поэтому формулировка "где наша функция setState со своим setTimeout...?" вообще не правильная. Наша функция ровно там, где она и была - где мы ее объявили. И далее там, где она видна, то есть находится она в области видимости или нет. Опять-таки, в нашем примере практически все в одной области видимости (кроме того, что выполняется внутри функций). И обе наши функции объявлены в той же области видимости, что и все остальное происходит. Иначе бы у нас попытка обратиться к функции, недоступной в нашей области видимости, просто приводила бы к ошибке. Но у нас же не возникает ошибок, верно?
>> Откуда при инициализации функции setState появился count со значением undefined (откуда он вообще count этот берется)
А где в моем примере вообще связь с setState и count? И где ты вообще увидил, чтобы хоть в одном месте у меня count был undefined? Но если ты вдруг решил поиграться и в setState в тело функции попытаться обратиться к count и получил undefined, то совсем не удивительно. Ведь count инициируется ниже по коду. var count = useState(5);
Что здесь не ясно?
А useState сама по себе не возвращает значение count. Она возвращает значение state.field || defaultValue. Где ты в теле этой функции видишь count? Ткни пальцем.