Извиняюсь, что не всем оказался понятен смысл проблемы.
Попробую объяснить более подробно.
Открываем документацию к XMLHttpRequest (https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest)
Где указано, что 3й параметр необязателен и по умолчанию равный true.
Вспоминаем, что если не передавать параметр в метод, то принимается undefined
т.е если верить данной документации, то вызовы
- open(method, url)
- open(method, url, undefined)
- open(method, url, true)
эквивалентны
В реальности оказывается, что есть два разных метода, вызываемых в зависимости от кол-ва передаваемых параметров. Причем дефолтное значение async в этих методах различное. Что несколько не очевидно.
А вот и нифига=)
Открываем твою же документацию, самую что ни на есть официальную: https://xhr.spec.whatwg.org/#xmlhttprequest
И читаем там волшебную строчку под номером 7 (параграф 4.5.1. The open() method):
If the async argument is omitted, set async to true, and set username and password to null.
Потом смотрим на твой вызов open(method, url, undefined), и что мы видим?
Правильно: 3 аргумента.
Все переданные аргументы хранятся в специальном объекте arguments.
И в случае вызова open(method, url, undefined) arguments будет иметь вид:
{0: <method>, 1: <url>, 2: undefined}
но аргументов, тем не менее три, и это значит, что
аргумент async не опущен, и этот undefined преобразовывается в Boolean со значением false, что ожидаемо приводит к синхронному вызову.
Считаю несколько некорректным приводить объяснение, уже после того как я сделал то-же самое тем-же самым образом. Данную ссылку я, как и вы, привел в объяснение данного поведения. Но часто ли вы заглядываете в описание стандартов, или всё же MDN чаще используется?
Вы пишете:
т.е если верить данной документации, то вызовы
- open(method, url)
- open(method, url, undefined)
- open(method, url, true)
эквивалентны
Из чего вдруг следует, что эквивалентны первые два вызова?
Их неэквивалентность следует как минимум из стандарта языка. И если программист читал стандарт языка, то он будет знать, что js не поддерживает перегрузку методов, соответственно, опциональные параметры можно получить либо задавая параметры по умолчанию, как в стандарте ES2015, либо из объекта arguments, что предпочтительнее, т.к. обеспечивает хорошую обратную совместимость. А дальше - элементарное приведение undefined к Boolean.
Но часто ли вы заглядываете в описание стандартов, или всё же MDN чаще используется?
Нафига вообще нужен программист, который ни разу не читал стандарт языка, на котором пишет?
Из чего вдруг следует, что эквивалентны первые два вызова?Из документации MDN
И если программист читал стандарт языка, то он будет знать, что js не поддерживает перегрузку методов, соответственно, опциональные параметры можно получить либо задавая параметры по умолчанию, как в стандарте ES2015, либо из объекта arguments, что предпочтительнее, т.к. обеспечивает хорошую обратную совместимость.Это не объясняет реализацию, и то что там происходит c приведением. То что там используется приведение undefined => false понятно только в практике. Я предполагал, что в обоих методах по умолчанию true.
Нафига вообще нужен программист, который ни разу не читал стандарт языка, на котором пишет?Я очень рад, что вы помните абсолютно все стандарты.
Web-технологии
551 пост5.8K подписчиков
Правила сообщества
1. Не оскорблять других пользователей
2. Не пытаться продвигать свои услуги под видом тематических постов
3. Не заниматься рекламой
4. Никакой табличной верстки
5. Тег сообщества(не обязателен) pikaweb