Заинтересован именно в глобальном понимании работы JS (именно "голого" JS, JS в браузере, NodeJS, и.т.д).
Прдскажите пожалуйста, правильно ли я уложил картинку?
JS сам по себе однопоточный, он может выполнять операции последовательно, одну за другой.
WebAPI браузера поедоставляет вещи типа setTimeout, или async await, коллбек-функции которые закидываются в очередь, а оттуда в порядке своей приоритетности попадают в стек по очереди. Промисы обрабатываются в приоритетном порядке.
По итогу, любые асинхронные операции попадают в основной и единсивенный стек вызовов и все равно выполняются последовательно?
Т.е получается, что это мнимая многопоточность? Под капотом все равно все выполняется в одной пробирке, так сказать?
Пока выполняется функция в стеке, то другие операции недоступны. А что если "асинхронные" операции занимают много памяти и выполняются долго. Если они выполняются в том же стеке, то они также перекроют доступ ко всем остальным операциям?
Буду рад если разъясните. Такое ощущение, что упускаю какие-то важные нюансы, либо неправильно понимаю эти.
А что если "асинхронные" операции занимают много памяти и выполняются долго
выполни в консоли браузера цикл на овермного раз, и пока он будет выполняться у тебя никакие динамические штуки не будут работать, т.к. поток будет забит.
for (let i = 0; i < 10000000000; i++) {} console.log('done')
А что если "асинхронные" операции занимают много памяти и выполняются долго.
Что это значит? Асинхронная операция, это, как правило, сетевой запрос либо отложенная на потом функция. Коллбэк, который выполняется по факту резолва асинхронной операции уже не асинхронный. Он выполняется синхронно в общем потоке. И да, если коллбэк тяжёлая функция, то заблокирует поток, всё зависнет пока коллбэк не отработает до конца. Поэтому тяжёлые операции принято разбивать на операции по меньше, чтобы дать возможность интерфейсу "дышать" хотя бы чуть чуть.
Т.е в основе своей, в JS всегда один стек вызовов, и операции в нем всегда выполняются по принципу last in first out. Нет никакой подлинной многопоточности?
Просто это был один из вопросов на собеседовании, про то, можно ли все-таки параллельно выполнять задачи в JS, или всегда последовательно.
Никита Савченко, а разве у браузера нет своего WebAPI, который предоставляет, например, setTimeout и setInterval, да и всю работу с DOM в принципе?
А если использовать JavaScript без браузера (что в принципе звучит нелогично :) ), то там останется его "начинка", в виде типов данных, функций, циклов, и.т.д.
Это немного путает, если честно. Вроде как он и разрабатывался для браузеров.
Reflections, JS это изначально браузерный язык, он сразу был таким, а не сначала голой ерундой, которую потому внедрили в браузер и добавили WebAPI и т.п. Он на это рассчитан
А если использовать JavaScript без браузера (что в принципе звучит нелогично :) ), то там останется его "начинка", в виде типов данных, функций, циклов, и.т.д.
Это уже про ноду, из js там убрали DOM, WebAPI, ну и всякое, что предназначено только для фронтенда и не подойдет как для полноценного языка программирования.
Для правильного вопроса надо знать половину ответа
WebAPI браузера поедоставляет вещи типа setTimeout, или async await, коллбек-функции которые закидываются в очередь, а оттуда в порядке своей приоритетности попадают в стек по очереди. Промисы обрабатываются в приоритетном порядке.
Обычные callback-функции не попадают в очередь, они вызываются в общем стеке. Кроме промисов в приоритетную очередь микрозадач функция может быть добавлена через queueMicrotask(function).
А что если "асинхронные" операции занимают много памяти и выполняются долго. Если они выполняются в том же стеке, то они также перекроют доступ ко всем остальным операциям?
Асинхронные операции выполняются отдельными служебными потоками параллельно с основным стеком. Поэтому сами они не могут заблокировать основной стек. По завершению/таймеру асинхронная операция кладёт функцию в очередь микро- или макрозадач.
JS однопоточный, но его движки v8 и libuv написаны на С++, который может использовать потоки ядра машины, на которой установлен JS для его целей. Причём количество подключаемых потоков можно изменять в настройках (для node)