С Babel почему свойство длины функции изменяется в зависимости от асинхронности или нет?

Учитывая следующее, я ожидал бы одинакового результата от обоих lengths:

const foo = (...args) => { }
console.log(foo.length)  // 0
const asyncFoo = async (...args) => { }
console.log(asyncFoo.length)  // 1

Но async Модификатор имеет значение. Это согласно спецификации ES7, что async меняет параметр длины?

Примечание: это не просто эзотерика. Я был сбит с толку, потому что Мокко ведет себя по-разному в зависимости от функции теста length, Я не мог понять, почему все перестало работать, когда я изменил функцию тестовой оболочки на async,

1 ответ

Решение

Если вы посмотрите на то, как Бабель проходит async функции, этот результат будет иметь больше смысла. Вы можете увидеть простой пример здесь.

Вы можете видеть, что исходная переданная функция не имеет параметров для метода (следовательно, length из 0).

Метод с другой стороны, transiled, в конечном итоге оказывается (хотя на самом деле это не обязательно):

function f(_x) {
  return _ref.apply(this, arguments);
};

Поскольку сгенерированная функция имеет единственный аргумент, length это 1.

Такое поведение, кажется, не является частью async/await spec (который можно найти по адресу https://tc39.github.io/ecmascript-asyncawait/)

Другие вопросы по тегам