Ответ изначально сбивает с толку, но впоследствии имеет смысл
- , ключевое слово
async
отсутствует.Существует async function
конструкция (MDN) : ссылка на спецификации .Таким образом, async
имеет особое значение, только если за ним следует функция - либо как выражение (как традиционная функция, так и функция со стрелкой) или как объявлениеТаким образом, переменная , называемая async
, является действительной, поскольку переменная, за которой следует function
, не является синтаксически допустимой.Нет столкновения с семантикой:
let foo;
//function declaration
foo function bar() {}; //SyntaxError
let foo;
//function expression
let bar = foo function() {}; //SyntaxError
- как для
await
, это на самом деле оператор, а не ключевое слово, и он является частью выражения await
(MDN) : ссылка на спецификацию .Семантика требует, чтобы за await
следовало унарное выражение и , чтобы быть внутри функции async
- что-то, что все еще не синтаксически допустимо с другими переменными.
У меня нет источника для этого, но разумно сделать вывод, что это было сделано для сохранения обратной совместимости.Если бы в ES5 был код, который использовал async
в качестве переменной, он внезапно сломался бы позже.Делая async
допустимым только в том случае, если в противном случае вы получите SyntaxError, которая обеспечивает сосуществование старого кода и нового кода.То же самое для await
.
Интересно, что семантика await
на самом деле приводит к поведению, которое снова изначально странно - вы не можете использовать его как переменную внутри функции async
.Либо объявив это:
async function foo() {
let await = "world"; //SyntaxError - not a valid identifier here
}
Нет доступа к нему:
let await = "world"; //valid identifier
async function foo() {
console.log(await); //SyntaxError - it is not followed by an expression
}
Это также изначально сбивает с толку, однако имеет смысл для обратной совместимости.Даже если бы в предыдущем коде ES6 в качестве переменной использовался await
, он не использовал бы его в async
функциях, поскольку их не было.Итак, старый код работает и до сих пор нет столкновений.