предисловие
Изначально я планировал написать интенсивное чтение исходного кода со (зачем читать со, потому что оно короткое), но гусь обнаружил, что у него есть ряд основных проблем, в которых он не разобрался досконально, и планировал написать серию статей по js, чтобы обобщить его собственное понимание (копия), надеюсь добиться прогресса с вами на пути обучения. Сначала спросите себя, когда интервьюер спрашивает о синхронизации и асинхронности в js, что вы должны ответить на этот вопрос? Понимание проблемы — это не что иное, как что-почему-как Что такое js-синхронизация и асинхронные проблемы --> почему возникают асинхронные проблемы --> как их решить.
1. Происхождение JavaScript
Появление технологии тесно связано со сценариями применения. JavaScript родился в 1995 году. В то время его основной целью была обработка некоторых операций проверки ввода, которые ранее выполнялись серверными языками, такими как Perl. До появления JavaScript данные формы нужно было отправлять на сервер, чтобы определить, пропустил ли пользователь обязательное поле или ввел недопустимое значение. Netscape Navigator надеется решить эту проблему с помощью JavaScript. Сначала название было livescript, но позже Netscape (Нетскейп) и Sun создали альянс разработчиков. Netscape временно переименовал LiveScript в JavaScript, чтобы поймать ажиотаж в СМИ о Java, поэтому, по сути, JavaScript не имеет ничего общего с Java (пока он горяч). Сегодня использование JavaScript перешло от простой проверки данных к возможности взаимодействия практически со всеми аспектами окна браузера и его содержимого. Сегодня JavaScript стал полнофункциональным языком программирования.
Резюме: Первоначальная цель js — реализовать взаимодействие между пользователем и браузером.
2. Почему JS однопоточный?
JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。 Это определяет, что это может быть только один поток, иначе возникнут сложные проблемы с синхронизацией.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
Итак, чтобы избежать сложности, JavaScript с самого начала был однопоточным, что стало основной особенностью языка и не изменится в будущем.
Примечание. Так называемый единый поток означает, что за интерпретацию и выполнение кода JavaScript в движке JS отвечает только один поток.
3. Компьютерная синхронизация и асинхронность (выделение)
Синхронный и асинхронный в компьютерной сфере — это полная противоположность понятиям синхронизации и асинхронности в нашей жизни, и кажется, что в этом виноват перевод. Синхронизация в жизни подчеркивается тем, что мы действуем в одном и том же темпе, например, вместе ходим по магазинам, едим, спим и спим. Асинхронность означает, что вы заняты собой, а я своим, идя в ногу и не мешая друг другу. Разве не так обстоит дело с синхронизацией и асинхронностью в компьютерах? Действительно нет.
«Синхронизация компьютеров»Это как: Вы едете учиться за границу, и вы не знаете, где вы живете, и вдруг вам не хватает средств на проживание, в это время вы решаете позвонить домой и сказать семье, чтобы они перевели расходы на проживание , но когда вы делаете исходящий звонок, собеседник всегда находится в состоянии ожидания (т.е.: звонит. Никак, не могу дозвониться), чтобы получить деньги на проживание, вы продолжаете звонить и ждать, и в итоге вы можете не успеть вовремя оплатить расходы на проживание, в результате чего дела, которые вы должны сделать сегодня, не будут завершены, и время будет потрачено впустую.
«Компьютерная асинхронность»То есть: когда вы заканчиваете разговор и обнаруживаете, что никто не отвечает, догадайтесь: другая сторона может быть занята и временно не может ответить на звонок, поэтому вы отправляете текстовое сообщение (или голосовую почту, или другие способы), чтобы сообщить другой стороне что вы заняты и другие важные вещи В это время вам не нужно постоянно звонить, и вы можете заниматься другими делами, через определенный период времени другой абонент ответит вам, когда увидит ваше сообщение. Конечно, другая сторона может или не может перевести деньги. Но в течение дня вы все равно много делаете. Или, может быть, вы временно заняли деньги у своего соседа по комнате и снова начали счастливую школьную жизнь.
Резюме: Синхронизация в компе стоит на очереди.Если у вас 101-я запаска, то "обработать" вас можно будет только после первых 100 очередей. Асинхронность в том, что она может позаботиться о ваших чувствах, даже если вы сто один.
4. Почему у одного потока js есть «асинхронная» проблема
После прочтения предыдущего предзнаменования у вас возникнут такие вопросы, JS однопоточный, так как же он реализует асинхронные операции? AJAX отправляет и возвращает запросы асинхронно, а setTimeout тоже выглядит многопоточным? помедленней
- js синхронный?
Да, один поток, он должен выполняться только синхронно (в очереди)
- Почему js должен быть асинхронным?
Если в JS нет асинхронности, он может выполняться только сверху вниз, если время парсинга предыдущей строки очень велико, следующий код будет заблокирован. Для пользователя блокировка означает «зависание», что приводит к ухудшению пользовательского опыта.
- Как одиночный поток js достигает асинхронности?
«Асинхронно» через цикл событий
Классическая проблема:
console.log('1')
setTimeout(function(){
console.log('2')
},0)
console.log('3')
// 1,3,2
То есть функции в setTimeout не выполняются немедленно, а откладываются на определенный период времени и выполняются после выполнения определенных условий.Этот тип кода называется асинхронным кодом.
Поэтому здесь мы впервые знаем метод классификации в JS, который заключается в разделении задач на: синхронные задачи и асинхронные задачи.
Хотя JS является однопоточным, ядро браузера является многопоточным.В ядре браузера различные асинхронные операции планируются и выполняются разными модулями ядра браузера, а асинхронные операции добавляют соответствующие обратные вызовы в очередь задач. Время добавления различных асинхронных операций в очередь задач также различается.Например, onclick, setTimeout и ajax обрабатываются по-разному.Эти асинхронные операции выполняются веб-ядром ядра браузера.Это DOM Binding, network и timer. модули.
Согласно этой классификации: механизм выполнения JS
- Сначала определите, является ли код js синхронным или асинхронным, синхронно введите основной процесс и асинхронно введите таблицу событий.
- Асинхронные задачи регистрируют функции в таблице событий, и при выполнении условий срабатывания они помещаются в очередь событий.
- После того, как синхронная задача войдет в основной поток, она будет выполняться до тех пор, пока основной поток не будет простаивать, и отправится в очередь событий, чтобы проверить, есть ли исполняемая асинхронная задача, и если есть, она будет помещена в основной процесс. Вышеупомянутые три шага выполняются в цикле, который является циклом событий.
Резюме: синхронизация может обеспечить постоянный порядок, но легко вызвать блокировку; асинхронность может решить проблему блокировки, но она изменит порядок и напишет ваш код в соответствии с различными потребностями.
Он будет по-прежнему обновляться каждую неделю. Ваши лайки, избранное и последующие тройные клики - моя мотивация. От этого зависит, как пойдет дорога вперед. Не всегда оглядывайтесь назад, мир и любовь.