Pull to refresh

Comments 14

Мне когда-то не хватало простой мысли в куче учебников по js, отчего такие приколы с setTimeout и с некоторыми другими функциями. А оказалось все просто - setTimeout не является функцией из js, а является функцией, которую добавляет окружение, т.е это реализация браузера Web APIs

js скачивается отдельно как бинарь, он готов интерпретировать ваш код, если там нет функций окружения. И изучать js необходимо именно с пониманием, что вот это язык, а вот этот язык расширяется окружением/средой. И с таким разделением сразу становится понятно, почему необходимы коллбеки промисы, код на выполнение выходит в другое место и результат вычислений необходимо забирать не простым return a+b.

JS не бинарь и не скачивается, и ничего не интерпретирует. Это интерпретируемый язык

Естественно я про интерпретатор говорил. Не найду сейчас репозиторий, который распространяет v8 в отдельным бинарем рядом с соответствующей версией хрома, но работает это вот так:
https://v8.dev/docs/d8

Чистый интерпретатор js без webapi

Это понятно, далее идут байндинги, и движки рендера

Интересное замечание, спасибо! Тоже заметила, что в JS и около есть темы, которые лучше понимаются, если их объясняют шире, чем принято...

Как раз я про обратное) мало какой учебник учит чисто js, там js всегда смешан с апи браузера, и складывается впечатление что это в целом один язык такой с приколами, типа почему то при передаче переменной в setTimeout контекст окружения теряется, а при передаче в Math() не теряется, и от чего это зависит? Это тупо надо было запоминать как глаголы исключения.

А понимание наличия нативных функций js и webapi js браузера ясно даёт понимание о причинах такой реализации

По мне js сначала надо изучать голый, далее добавлять web api

Сам по себе ивент луп довольно не простая штука, отличается в реализации у некоторых браузеров и ноды и прочих окружений. Вы описываете не то как он работает, что это, зачем оно, его природу и так далее. А просто разобрали вопросы на собесе, людей, которые также не всегда понимаю о чем спрашивают)))

Я хотела написать заметку о "не простой штуке" очень просто, насколько это возможно сделать, не погрешив против истины) Чтобы человек, который до сего дня ничего не слышал про евент луп, получил общее представление, а потом на этом основании строил "настоящее и сложное", ссылки я добавила. Не каждому дано перейти от "полного незнания", к чтению сложных статей и документаций. А если кто-то решит, что ему и этого хватит, лишь бы пройти собеседование, то пусть это останется на его совести)

Предполагается, что с таким подходом проще понять, как выполняется хитрый код со вложенными друг в друга колбэками, промисами и таймерами

На простых примерах - да. Но иногда бывает с небольшим подвохом:

Пример
setTimeout(() => console.log(a - b), 0);

const promise = new Promise((resolve) => {
    func();
    resolve();
});

let a = 1;
let b = 2;

function func() {
    a++;
}

promise
    .then(() => console.log(a))
    .catch(() => console.log(b--))
    .catch(() => console.log(0));

Promise.resolve().then(() => console.log(3));
// Какой-то синхронный код
// ...

// Цикл с лимитами на время исполнения
loop: do {
  // исполняем микрозадачи
  while (!timed_out() && poll_microtasks() > 0) run_microtask(microtasks_timeout())

  // исполняем задачи среды (и пятницы)
  while (!timed_out() && poll_env_tasks() > 0) run_env_task(env_tasks_timeout())

  // спрашиваем по поводу превышения лимитов на время исполнения (убить программу или дать ещё покрутиться)
  if (timed_out()) handle_timed_out()

  // ждём новых событий (обычно до конца времён или пока очередь наблюдения не опустеет)
  poll_wait(poll_timeout())

  // проверяем, что есть события
} while(poll_events() > 0)

// Подчищаем и завершаем программу
// ...

Цикл не слишком сложный получился. Но может это не слишком понятно.

Просто его нужно прочувствовать, и тогда придёт осознание того, как он устроен в целом. Привычное понимание он ломает, но достаточно один раз понять, и понять как это применять. И тогда дополнительные вопросы перестанут возникать

Лучше всего рассказывает о том как работает event loop под капотом, и про микро и макротаски Will Sentance в цикле видео JavaScript: The Hard Parts.

Там сразу становится понятно что делает js, что браузер и почему оно такое какое есть

а можете скинуть ссылку на материал, пожалуйста?

Sign up to leave a comment.

Articles