ожидание вне асинхронной функции не выдает ошибку в консоли
MDN говорит:
Помните, ключевое слово await
допустимо только внутри async
функций. Если вы используете его вне тела async
функции, вы получите SyntaxError
.
Но это не так.
Попробуйте этот код в консоли DevTools, без ошибок, просто результат:
async function a(val) { return val; }
await a(10) // await is not inside async function
10
Что не так с кодом или документами?
Ответы
Ответ 1
Документы MDN верны и объясняют, как это работает в JavaScript.
Это просто функция, добавленная DevTools для упрощения тестирования асинхронного/ожидающего кода. И это не функция JavaScript.
Похоже, что он поддерживается с 08.11.2017 в DevTools:
https://chromium.googlesource.com/chromium/src.git/+/e8111c396fef38da6654093433b4be93bed01dce
Если вы шпионите
ConsoleModel.js
в строке 129 они имеют функцию для вычисления выражений, помеченных как асинхронные:
async evaluateCommandInConsole
Ответ 2
Нет ничего плохого
Вы нашли особенность консоли DevTools ! Именно там, чтобы сделать его как можно проще экспериментировать с async
- await
кода в живой среде. Вы можете представить, что любой код, который вы вводите в консоль, автоматически оборачивается в async
функцию. На самом деле, как указал другой ответ, именно это и происходит.
Важно отметить, что хотя это работает в консоли, это не является функцией JavaScript.
Итак, все ваши наблюдения верны и ожидаемы! Документы MDN точны, потому что если вы попытаетесь загрузить скрипт на страницу, которая использует await
вне async
функции, произойдет ошибка. С другой стороны, консоль DevTools предназначена для обеспечения этой работы (исключительно для эргономики разработчика), поэтому ваш код выполняется в консоли без ошибок.
Это не единственная хитрость, которую у консоли DevTools есть в рукаве. В общем, если вы действительно хотите проверить, как какой-то код выполняется на странице, лучше всего запускать скрипт на странице, а не в консоли.