С Babel почему свойство длины функции изменяется в зависимости от асинхронности или нет?
Учитывая следующее, я ожидал бы одинакового результата от обоих length
s:
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/)