使用Babel为什么函数长度属性会根据异步而改变?

时间:2016-11-23 19:13:38

标签: javascript babeljs

鉴于以下情况,我期望length s:

的结果相同
const foo = (...args) => { }
console.log(foo.length)  // 0
const asyncFoo = async (...args) => { }
console.log(asyncFoo.length)  // 1

async修饰符有所不同。这是根据ES7规范async更改长度参数吗?

注意:这不仅仅是深奥的。我被绊倒了,因为Mocha的行为有所不同,具体取决于测试函数的length。当我将测试包装函数更改为async时,我无法弄清楚为什么一切都停止了。

1 个答案:

答案 0 :(得分:2)

如果你看看Babel如何转换async函数,这个结果会更有意义。您可以看到a simple example here

你可以看到原始的transiled函数没有方法的参数(因此length为0)。

另一方面,转换后的方法最终成为(即使它实际上并不需要):

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

由于生成的函数只有一个参数,length为1。

此行为似乎不是async / await规范的一部分(可在https://tc39.github.io/ecmascript-asyncawait/#async-function-instances-length找到)