Nano Hash - криптовалюты, майнинг, программирование

Javascript — как прослушиватели событий работают под капотом

У меня есть следующий код:

function sayHiLater(){
    var greeting = "Hi!";
    setTimeout(function() {
        console.log(greeting);

    }, 3000); 
    console.log("Hello before hi");
}

sayHiLater();

Я хотел бы лучше понять, как под капотом работают слушатели событий, поэтому в моем примере выше, когда выполняется setTimeOut, что на самом деле происходит? Я знаю, что это создает новый контекст выполнения, но мой вопрос: этот контекст выполнения просто задерживается на 3 секунды, что означает, что стек выполнения тем временем переходит к другим вещам, и по истечении 3 секунд он возвращается к этому контексту выполнения, или он просто переходит к движку браузера какая-то ссылка на аргумент анонимной функции, сообщающая ей, когда запускать, а затем сразу контекст выполнения setTimeOut извлекается из стека выполнения. Или я просто совсем далек от того, что происходит на самом деле. Спасибо за ваше время.


  • простой реализацией может быть: отправить событие в очередь событий -> заставить исполнителя извлекать первое событие из очереди событий-> заставить исполнителя искать обратный вызов evnet (скажем, из карты) -> выполнить обратный вызов события 05.11.2015
  • Я удалил свой ответ, потому что увидел в этом вопросе возможную копию: stackoverflow.com/questions/12930272/ 06.11.2015

Ответы:


1

Это просто передача движку браузера какой-то ссылки на аргумент анонимной функции, сообщающей ему, когда запускать, а затем сразу же контекст выполнения setTimeOut извлекается из стека выполнения.

Да, именно это и происходит. Контекст выполнения setTimeout немедленно возвращается (и переходит к следующему оператору, вашему console.log).

Затем, после того, как ваш текущий ход завершится и код больше не будет выполняться, движок возвращается к циклу обработки событий и ждет, пока что-то произойдет. Через 3 секунды время готово для запуска обратного вызова, и когда никакой другой код уже не выполняется, цикл событий запускает анонимную функцию.
Таким образом, setTimeout на самом деле не вызывает свой обратный вызов, а только откладывает на потом. Он будет вызван самим циклом обработки событий, когда время таймера истечет.

Обратите внимание, что анонимная функция, помещенная в таймер, является закрытием (она закрывается через переменную greeting), поэтому переменная Окружение ("область действия") sayHiLater будет сохранено (без сбора мусора) даже после того, как контекст выполнения sayHiLater будет удален из стека, до тех пор, пока обратный вызов не будет выполнен.

05.11.2015
  • Эй, парень выше, вы сказали, что контекст выполнения не закончился, но стек выполнения просто переходит к следующему, пока не пройдет 3 секунды, а затем он возвращается к нему (если в стеке больше ничего нет) и выполняет эту анонимную функцию 05.11.2015
  • Я имел в виду комментарий @ambodi. 05.11.2015
  • @ user2081462: Он может не знать, о чем говорит :-) Какой контекст выполнения вы имеете в виду, глобальный, sayHiLater()s, setTimeout(…)s или контекст обратного вызова? 05.11.2015
  • Я говорил о контексте выполнения setTimeout — как только вы передаете ему аргументы и выполняете его, возникает новый контекст выполнения. Мой вопрос заключался в том, будет ли javascript просто запускать контекст выполнения, видеть, что задержка составляет 3 секунды, переходить к другим вещам, а затем возвращаться к контексту выполнения setTimeout по прошествии 3 секунд? или дело в другом. и, кстати, мне любопытно узнать, верно ли это для всех прослушивателей событий. 05.11.2015
  • Контекст выполнения — это кадр стека. Он существует только во время разговора. Из-за однопоточной природы JS и его синхронной модели выполнения до завершения (на ход событийного цикла) они обычно не существуют очень долго. Не уверен, что должно означать не закончено 05.11.2015
  • Я просто написал еще один комментарий, чтобы уточнить, см. выше 05.11.2015
  • Вы передаете аргументы вызову setTimeout, который создает контекст выполнения для вызова setTimeout (который зависит от реализации, поскольку setTimeout является собственной функцией хоста). Он создает таймер и планирует аргумент обратного вызова и немедленно возвращается, и с этим возвратом контекст выполнения уничтожается. Затем, когда прошло 3 секунды, и цикл событий подбирает таймер, цикл событий вызывает обратный вызов anon. Только тогда будет создан контекст выполнения для обратного вызова. 05.11.2015
  • Давайте продолжим обсуждение в чате. 05.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..