У меня создалось впечатление для того, что JavaScript был всегда асинхронным. Однако я узнал, что существуют ситуации, где это не (т.е. манипуляции DOM). Существует ли хорошая ссылка где-нибудь о том, когда это будет синхронно и когда это будет асинхронным? JQuery влияет на это вообще?
JavaScript всегда синхронный и однопоточный. Если вы выполняете блок кода JavaScript на странице, то ни один другой JavaScript на этой странице в настоящее время не будет выполнен.
JavaScript является асинхронным только в том смысле, что он может, например, вызывать Ajax. Вызов Ajax перестанет выполняться, и другой код сможет выполняться до тех пор, пока вызов не вернется (успешно или иным образом), после чего обратный вызов будет выполняться синхронно. Никакой другой код в этот момент выполняться не будет. Он не будет прерывать любой другой код, который выполняется в данный момент.
JavaScript-таймеры работают с таким же типом обратного вызова.
Описывание JavaScript как асинхронного, возможно, вводит в заблуждение. Точнее сказать, что JavaScript синхронный и однопоточный с различными механизмами обратного вызова.
jQuery имеет опцию на вызовах Ajax, чтобы сделать их синхронными (с опцией async: false
). Новички могут соблазниться использовать эту опцию некорректно, так как она позволяет использовать более традиционную модель программирования, к которой можно было бы привыкнуть. Причина, по которой это проблематично, заключается в том, что этот вариант будет блокировать all JavaScript на странице до тех пор, пока он не завершится, включая все обработчики событий и таймеры.
JavaScript однопоточный, и все время вы работаете над нормальным синхронным выполнением кода.
Хорошими примерами асинхронного поведения, которое может иметь JavaScript, являются события (взаимодействие с пользователем, результаты Ajax-запросов и т.д.) и таймеры, в основном действия, которые могут произойти в любое время.
Я бы порекомендовал вам обратить внимание на следующую статью:
Эта статья поможет вам понять однопотоковую природу JavaScript и то, как работают таймеры внутренне, и как работает асинхронное выполнение JavaScript.