ожидание вне асинхронной функции не выдает ошибку в консоли

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 есть в рукаве. В общем, если вы действительно хотите проверить, как какой-то код выполняется на странице, лучше всего запускать скрипт на странице, а не в консоли.