这个箭头函数怎么不报错?

How this arrow function doesn't give any error?

我只是 运行 研究了一些代码,然后我做了一个测试,发现了一些我不明白的东西。

hey(
  () => {},
  () => {
    foo: "bar";
  }
);

为什么以下语法是有效语法?在第一个参数中,我可以理解,因为是一个空函数作用域,但是在第二个参数中,它怎么不给我一个错误?

如果它返回一个对象,它应该是 ({...}) 并且最后不接受 ;,所以这意味着第二个参数不是一个对象。

如果它不是一个对象,那它是什么?为什么不是语法错误?

这里发生了什么黑javascript魔法?

这是 codesanbox 上的示例,它没有给我任何语法错误。

编辑

我刚刚又发现了一些奇怪的东西。

hey(
  () => {},
  () => {
    "bar"; // without foo:
  }
);

这个怎么不报错?

第二个参数不是对象。这是一个功能。第二个参数基本上等同于说

function() {
   foo: "bar";
}

这实际上并没有出错,尽管看起来应该如此

如果你想要一个箭头函数立即return一个对象,语法是

() => ({foo:'bar'})

如果您跳过 (),它会被解释为 labeled statement

() => {
  foo: "bar";
}

如果再加一个属性,就可以清楚地看到错误

() => {
  foo: "bar",
  baz: ''
}