Вот здесь вы вешаете слушателя события. И он сидит себе и ждет:
oReq.addEventListener("load", reqListener);
Дальше вы инициируете вызов - это как ввести адрес сайта в браузере и нажать ввод. Но интернет медленный, сайт тормозной. Пройдет какое-то время.
И вот, наконец, когда страница соизволит загрузиться, выстрелит событие "load", которое и будет отловлено слушателем - выполнится, наконец-то, функция reqListener()
Разрыв, рвущий нить выполнения этого кода и делающий его из синхронного асинхронным – где-то внутри объекта XMLHttpRequest
и не виден невооруженным глазом.
Теоретически, внутри мог бы быть и синхронный код, который по методу send()
сразу же явно дергал функцию, которую мы передали как слушателя события. Но это был бы уже не тот XMLHttpRequest
, каким мы его любим.