Цикл событий JavaScript

  1. Зачем нам нужно асинхронное поведение в браузере
  2. Мужество: стек вызовов и очередь сообщений
  3. Асинхронный JavaScript
  4. SetTimeout (..., 0)
  5. Область обратного вызова
  6. Регистрация слушателей
  7. Обзор кода
  8. Завершение

У вас был шанс поиграть в DOM, и он позволяет вам делать довольно интересные вещи. Но вы действительно увидите всю мощь jQuery, когда узнаете о событиях в браузере. Если манипулирование DOM - это хлеб с маслом, события - это торт.

Ваш браузер - это один большой бесконечный цикл. Он ждет, чтобы вы все время что-то делали, и когда вы это делаете, он запускает «События», чтобы описать то, что вы только что сделали. Некоторые события генерируются пользователем, такие как щелчок, зависание, перемещение мыши, ввод клавиш и т. Д. Другие генерируются браузером или жизненным циклом различных запросов. Вы уже работали с одним из них - функция $ (document) .ready () прослушивает событие ready, которое ваш браузер отправляет после завершения загрузки всего DOM.

Ваш код JavaScript может зарегистрировать «слушатели» для тех событий, которые являются функциями, которые вызываются при обнаружении события.

На этом уроке мы покажем, как работает цикл обработки событий JavaScript и как он взаимодействует с браузером. Он немного более технический, чем большинство из того, что мы освещаем, но он предоставлен, так что вы можете получить хорошую мысленную модель для того, что на самом деле происходит, когда вы регистрируете нового слушателя или, как вы увидите позже, когда вы начинаете делать асинхронные HTTP-запросы с AJAX.

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

Зачем нам нужно асинхронное поведение в браузере

Чтобы понять, как обрабатываются события, стоит сделать шаг назад и посмотреть, как работает собственный цикл событий JavaScript. Это функция, которая дает JavaScript возможность действовать асинхронно и является определяющей характеристикой, которая делает его привлекательным языком для других приложений, таких как программирование на стороне сервера (через Node.js).

Такое асинхронное поведение необходимо, потому что типы событий, с которыми работает JavaScript, часто бывают трудоемкими (HTTP-запросы) или сильно прерывистыми (щелчки мыши). Ваш браузер буквально бомбардируется различными событиями все время. Если бы каждое из этих событий блокировало выполнение других функций, у вас были бы проблемы.

Допустим, вы нажимаете кнопку, и она отправляет сетевой запрос, выполнение которого занимает много времени. Если бы процесс был действительно однопоточным и синхронным, кнопка даже не смогла бы перерисовать себя в поднятом положении как «не нажато», пока запрос не вернется.

Мы еще немного посмотрим, сколько времени займет выполнение определенных операций за минуту. Однако сначала давайте поднимем капот и посмотрим, что на самом деле происходит с JavaScript.

Мужество: стек вызовов и очередь сообщений

Начнем с основ. JavaScript является однопоточным, но он имитирует поведение многопоточного процесса, эффективно используя его время, когда дело доходит до асинхронных процессов. Среда выполнения JavaScript делает это, расставляя приоритеты задач между стеком вызовов и очередью сообщений .

Стек вызовов содержит список сообщений (вызовов методов), которые должны быть выполнены ПРЯМО СЕЙЧАС. Каждое из этих сообщений называется стековым фреймом, когда оно находится в стеке вызовов. Новый фрейм создается каждый раз, когда среда выполнения сталкивается с вызовом метода или любым другим поведением в сценарии, таким как запуск события. Если выполняемый метод вызывает другой метод, это новое сообщение добавляется в верхнюю часть стека и теперь имеет полный приоритет. Когда сообщение возвращается (с или без возвращаемого значения), его кадр удаляется из стека.

Среда выполнения постоянно проходит по стеку вызовов и выполняет кадры сверху вниз. Поскольку JavaScript является однопоточным, выполнение фрейма требует полного внимания. Но это происходит очень быстро, поэтому он часто работает через стек и достигает дна.

Несколько реальных точек интереса о стеке:

  1. Вы также должны теперь иметь возможность визуализировать, что происходит во время выполнения программы - и как наличие методов, вызывающих методы, вызывающие методы, будет просто поддерживать рост стека до тех пор, пока не вернется самый глубокий уровень, а затем стек постепенно сжимается вниз, пока каждый последующий метод не возвращается до оно исчезает, когда возвращается последнее сообщение.
  2. Теперь вы можете видеть, как создание бесконечного цикла, в котором функция продолжает вызывать себя, может вызвать бесконечный рост стека ... и создать условие "переполнения стека".

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

Когда среда выполнения JavaScript достигает дна стека, она переходит («опрашивает») в очередь сообщений и удаляет первое добавленное сообщение. Принимая во внимание, что стек всегда выполняет последний элемент, помещенный сверху (LIFO), очередь представляет собой систему «первым пришел - первым обслужен» (FIFO), в которой сообщение, ожидающее самого длинного, выполняется первым. Как только сообщение извлекается из очереди, оно добавляется в стек для немедленного выполнения.

Когда у вас есть очередь, вы можете выгружать сообщения, которые не являются необходимыми немедленно в конец очереди. В JavaScript все новые сообщения помещаются в конец очереди. Вот что происходит, когда браузер обнаруживает событие, например, щелчок мышью. Когда этот щелчок обнаружен, переводчик проверяет, слушает ли кто-либо это конкретное событие. Если это так, он получает функцию обратного вызова , предоставленную слушателем, и помещает ее в конец очереди для запуска.

Асинхронный JavaScript

Если вы обращаете внимание, это на самом деле не асинхронно, а по-прежнему синхронно. И это прекрасно работает большую часть времени. Большую часть времени ваш цикл выполнения JavaScript просто опрашивает пустую очередь, надеясь, что что-то произойдет. Когда он получает сообщение для помещения в стек и запуска, это сообщение почти всегда завершается достаточно быстро, чтобы оно не влияло ни на что другое.

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

  1. L1-кэш: 3 цикла
  2. L2-кеш: 14 циклов
  3. RAM: 250 циклов
  4. Диск: 41 000 000 циклов
  5. Сеть: 240 000 000 циклов

Это верно - выполнение сетевого запроса в миллион раз медленнее, чем доступ к ОЗУ. Но все это занимает ограниченное количество времени. Если вы ожидаете завершения сетевого запроса и имеете только стек вызовов для работы, ваше приложение в основном просто переходит в спящий режим, пока не вернется.

В JavaScript все эти операции ввода-вывода могут использовать преимущества очереди сообщений, чтобы стать асинхронными. Это потому, что они могут выполняться как «неблокирующий вызов», что означает, что они фактически выходят из стека вызовов и помещают свои обратные вызовы в отдельную очередь сообщений, которая поддерживается сторонним процессом, таким как ваш браузер (который имеет свой собственный потоки)).

Например, если вы выполняете сетевой запрос «XHR» (AJAX) в браузере, JavaScript разгрузит свой обратный вызов в отдельную очередь, которая обрабатывается браузером. Когда запрос завершается, браузер обнаруживает это и помещает обратный вызов в очередь JavaScript для нормальной работы. В то же время, для вашего JavaScript-кода жизнь продолжается как обычно, и он может продолжать обрабатывать стек и очередь в обычном режиме.

Другие типы ввода-вывода могут использовать другие очереди, которые обычно предоставляются вашим веб-браузером.

SetTimeout (..., 0)

Иногда есть хитрость, которую разработчики JavaScript используют для асинхронного запуска метода. Для этого передайте метод в качестве обратного вызова функции setTimeout, которая задерживает выполнение на указанный интервал времени. Функция обратного вызова передается API синхронизации вашего браузера и отправляется обратно после указанной задержки.

Если вы задерживаете 0 мс, браузер немедленно добавляет функцию обратного вызова в конец очереди. Подумайте об использовании setTimeout в качестве места выброса из текущего стека вызовов прямо в конец очереди. Или не "прямо" в конец очереди, если вы укажете ненулевой интервал задержки.

Хотя технических деталей может быть больше, чем вам нужно знать, полезно сделать функцию неблокируемой:

console.log («Я был казнен первым!»); // обратите внимание на задержку 0 мс. Вы можете экспериментировать // с передачей этих разных значений. // 1000ms = 1s setTimeout (function () {console.log («Я сейчас в конце очереди!»);}, 0); console.log («Я исполняюсь раньше»); console.log («JavaScript проверяется»); console.log («любые новые сообщения в очереди»); console.log («так что myNonBlockingFunction не будет»); console.log («беги, пока правильно ...»); console.log ( "о ..."); console.log ( "Now!");

См Визуализация этого примера здесь.

Если вам интересно, см. Вкладку «Ресурсы» для дополнительного чтения и объяснения видео.

Область обратного вызова

Мы рассмотрим область более подробно позже, но наша модель стека и очереди особенно актуальна сейчас, когда вы рассматриваете обратные вызовы слушателя событий. Мы только что описали, как типичное сообщение попадает в очередь сообщений JavaScript, а затем его обратный вызов выполняется как новое сообщение отдельно от исходного сообщения. Какие переменные являются локальными для обратного вызова? Сколько информации «обратный вызов» «знает» об исходной среде теперь, когда она сама по себе?

Это вопросы Scope. На практике, стек вызовов и переменные среды, необходимые для обратного вызова, все хорошо упакованы в замыкание и сохраняются, когда они необходимы. Опять же, мы поговорим об этом чуть позже.

Для хорошего объяснения всего этого см. этот блог из углеродной пятерки.

Регистрация слушателей

Если вы думаете о цикле событий JavaScript в контексте браузера, все становится более интересным.

Браузер постоянно запускает такие события, как щелчки мышью. Большинство из них падают на слух и не делают ничего особенного. Как разработчик, вы можете использовать JavaScript для регистрации прослушивателя событий , который отправляет обратный вызов для этого прослушивателя в специальную очередь, поддерживаемую вашим браузером. Когда происходит указанное событие, ваш браузер определяет подходящие для вас обратные вызовы и отправляет их обратные вызовы в очередь сообщений JavaScript для запуска.

Старый способ добавления прослушивателей событий заключался в том, чтобы помещать их непосредственно в разметку HTML, добавляя свойства, такие как onclick, которые могли бы выполнять код немедленно или вызывать другие функции JavaScript. Это НЕ считается хорошей практикой, потому что оно тесно связывает ваш JS и разметку, но вы иногда будете видеть, что оно используется с быстрыми и грязными взломами:

<button onclick = "alert ('Hello')"> поздороваться </ button>

Более обычным примером этого в чистом JavaScript является использование функции addEventListener. В приведенном ниже примере мы добавили анонимный прослушиватель «click» к первому элементу абзаца на странице:

// Обратите внимание, что нам нужно извлечь первый // элемент из коллекции, которой нам будет предоставлен документ .getElementsByTagName ("p") [0] .addEventListener ("click", function () {console.log ("Нажал на first <p>! ");});

Анонимная функция, которую мы предоставили addEventListener, сохраняется вашим браузером и отправляется обратно в JavaScript для запуска всякий раз, когда обнаруживается событие «click» для этого конкретного элемента.

Использовать слушателей действительно так просто.

Обзор кода

Важные фрагменты кода из этого урока

// Извлечь в конец очереди setTimeout (function () {...}, 0); // Добавить прослушиватель кликов хакерским способом <button onclick = "alert ('Hello')"> Say hello </ button> // Добавить прослушиватель кликов способом JavaScript var myEl = document.getElementsByTagName ("p") [0 ]; myEl.addEventListener ("click", function () {console.log ("Clicked the first <p>!");});

Завершение

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

Похожие

Конфликты Javascript
... Javascript. Что это значит? Например в Joomla! (но, конечно, это может произойти в любой сложной системе), вы можете установить плагины, модули, компоненты и шаблоны. Такие части системы могут использовать разные библиотеки Javascript, которые могут конфликтовать друг с другом. Пример: Компонент A загружает библиотеку Mootools (стандартная, встроенная в Joomla!) Плагин B загружает собственную библиотеку Mootools, отличную от встроенной в
Apple iPad mini - Обзор Паутины
В последнее время многие тестовые таблетки прошли через мои руки. Я использовал его почти два месяца BlackBerry PlayBook а, который я тогда обменял на Samsung и
Покупка домена: что нужно знать об этом?
Домены были с нами более 30 лет. Начало было не очень многообещающим, но сегодня рынок доменов настолько широк, что у нас есть полная свобода регистрации и выбора домена для нашего сайта. Перед окончательной покупкой домена стоит знать несколько, казалось бы, подробных деталей, которые впоследствии окажутся актуальными с точки зрения SEO. Проверка домена в инструменте WHOIS Для покупки и регистрации домена он должен быть бесплатным. Это означает, что
Goose VPN обзор
Goose VPN является поставщиком конфиденциальности в Нидерландах с некоторыми привлекательными функциями и продуктами. Гусь имеет обширную сеть из 26 стран. Большинство из них находятся в Европе и Северной Америке, но есть также серверы в Гонконге, Индии, Израиле и Сингапуре. (Австралийский сервер, который отсутствовал в нашем последнем обзоре, теперь вернулся.) Есть поддержка
Обзор Антивируса Лаборатории Касперского 2018 - плюсы, минусы и вердикт
Изображение 1 из 8 Изображение 2 из 8 Изображение 3 из 8
Обзор торговых площадок
Если у нас нет большого маркетингового бюджета или команды специалистов для управления магазином, стоит сделать ставку на одну из платформ электронной коммерции. Какой выбрать? Все зависит от того, кто наш получатель и где он. Аллегро - общенациональная распродажа Чтобы начать продавать, нам нужен корпоративный аккаунт. Заполните регистрационную форму, предоставив данные компании, включая NIP, REGON и KRS (если есть). Затем мы проходим через этап активации, и мы также должны
Avira Бесплатный антивирус обзор
Avira Operations - немецкий гигант безопасности, который предоставляет мобильные и настольные компьютеры. антивирус продукты для любого уровня дома и бизнес-пользователя. Avira Бесплатный антивирус базовый продукт компании, включающий ядро ​​антивируса Avira для обнаружения и блокировки вредоносных программ в режиме реального времени. Пакет использует несколько
Amazon Fire TV Stick с Alexa (2017) обзор
Развитие говорящих технологий не так давно, как вы думаете. В 1773 году Кристиан Кратценштейн построил говорящий аппарат, используя трубки и органные трубы для создания искусственных голосовых связок; и в 1939 году первый электронный синтезатор речи под названием VODER (Voice Operating DEmonstratoR) произнес слова «Добрый вечер, радиослушатели» на Всемирной выставке в Нью-Йорке. Но на данный момент в истории технологий голосовой помощник du jour - это Amazon от
HTC 10 Обзор
С HTC 10 У меня такое ощущение, что HTC ищет новый старт. Они идут годами из ряда плохих смартфонов, но, похоже, теперь у них обновленное видение или перспективы, поскольку они - компания VR. Кстати, это только отчасти шутка, потому что у меня действительно есть ощущение, что это стало компанией VR, которая также делает телефоны. Достаточно взглянуть на отсутствие громких пресс-мероприятий, рекламных роликов или других
Обзор Lumia 1520: действительно большой Windows Phone
Nokia, очевидно, решила, что ее следующая большая стратегия по увеличению доли на рынке - увеличить свои телефоны. Lumia 1520 - самый большой Windows Phone, настолько большой, что единственными людьми, которым будет легко его держать, являются профессиональные баскетболисты. Звездные атлеты, как правило, стремятся к моде, и, к сожалению, для Nokia, это не Windows Phone. Характеристики Lumia 1520 впечатляют - он имеет экран 1080p, четырехъядерный процессор и
Рецепт корейского бюджета? Обзор LG K4 (2017)
Низкая цена Двойная симка. Съемный аккумулятор. Даже хороший вид. Вот мои первые четыре ассоциации с LG K4 (2017) Один из самых дешевых бюджетистов в портфолио корейского производителя, ориентированный на наименее требовательных пользователей. Несмотря на действительно плохую спецификацию, его цена довольно большая, потому что почти 500 злотых. Итак, имеет ли эта модель смысл? Как

Комментарии

Что нужно сделать, чтобы устройство работало как можно дольше на одной зарядке?
Что нужно сделать, чтобы устройство работало как можно дольше на одной зарядке? 1. Экран Чем ярче он светит, тем больше заряжает батарею - это просто зависимость. Я не буду рекомендовать вам в этом тексте всегда придерживаться самого низкого уровня яркости экрана, поскольку он сильно потеряет на его читабельность. С другой стороны, при полной яркости экрана это тоже безумие. Поэтому убедитесь, что ваш экран сам регулирует яркость благодаря датчику, измеряющему уровень окружающего
Что такое Sass и зачем его использовать?
Что такое Sass и зачем его использовать? Для тех из вас, кто не знает, что такое Sass, лучше всего отправиться в официальный сайт Sass , Sass является аббревиатурой от Syntactically Awesome StyleSheets и является расширением CSS, которое добавляет мощность и элегантность базовому языку. С Sass (Syntaxically Awesome StyleSheets)
Но зачем кому-то тратить деньги на это после того, как они уже потратили на гарнитуру более 100 долларов (раньше было 200 долларов)?
Но зачем кому-то тратить деньги на это после того, как они уже потратили на гарнитуру более 100 долларов (раньше было 200 долларов)? Затем есть то, что обычно известно как поле зрения (FOV), которое определяет самое широкое измерение, которое ваши глаза могут видеть изображение. Несмотря на то, что Gear VR обеспечивает нечто вроде погружения, похоже, что вы видите это через шлем иглу. Однако становится все хуже. Из-за отражения света ваши глаза заметят два прозрачных темных квадрата
Помните, когда Motorola отказалась от своей оболочки Android и начала давать нам «чистый» опыт Android с тонкими усовершенствованиями, одновременно обновляя устройства быстрее, чем кто-либо другой?
Помните, когда Motorola отказалась от своей оболочки Android и начала давать нам «чистый» опыт Android с тонкими усовершенствованиями, одновременно обновляя устройства быстрее, чем кто-либо другой? Вот что HTC делает в эти дни. Чувак освежает и оооочень приветствуется. Проведя последние пару месяцев с Galaxy S7 и G5, двумя телефонами, которые до краев заполнены скинами, вредоносными программами и прочим бессмысленным мусором, этот телефон кажется почти скучным или скучным, только на самом деле,
Нужно ли полностью покрывать ванную этим камнем?
Нужно ли полностью покрывать ванную этим камнем? Конечно нет - многое зависит от наших собственных предпочтений и идей. Что такое мрамор? Мрамор - это камень, который, как думают многие дизайнеры интерьера, никогда не выйдет из моды! Этот материал относится к тем натуральным камням, которые образовались
На что нужно обратить внимание, чтобы проверить, честен ли продавец?
На что нужно обратить внимание, чтобы проверить, честен ли продавец? Контактная информация должна быть видна Это первая и самая важная вещь, которую мы должны проверить при проверке продавца или магазина. Если на сайте нет четко предоставленной информации о компании, которую можно проверить в национальном реестре, давайте прекратим делать покупки. Обычно такая информация предоставляется в нижнем колонтитуле сайта или, как в случае магазина
Что нужно сделать, чтобы сделать продукт заметным по сравнению с другими?
Что нужно сделать, чтобы сделать продукт заметным по сравнению с другими? Одним из инструментов, который можно использовать для привлечения покупателя и продажи товара, является позиционирование товара. Весь процесс направлен на увеличение рекламы компании и привлечение как можно большего числа клиентов благодаря надлежащему управлению продуктом. Позиционирование продукта

Какие переменные являются локальными для обратного вызова?
Сколько информации «обратный вызов» «знает» об исходной среде теперь, когда она сама по себе?
Что это значит?
Какой выбрать?
Итак, имеет ли эта модель смысл?
Что нужно сделать, чтобы устройство работало как можно дольше на одной зарядке?
Что такое Sass и зачем его использовать?
Но зачем кому-то тратить деньги на это после того, как они уже потратили на гарнитуру более 100 долларов (раньше было 200 долларов)?
Помните, когда Motorola отказалась от своей оболочки Android и начала давать нам «чистый» опыт Android с тонкими усовершенствованиями, одновременно обновляя устройства быстрее, чем кто-либо другой?
Нужно ли полностью покрывать ванную этим камнем?