这个箭头函数可以缩短吗?这些是一样的吗?

Can this arrow function be shortened? Are these the same?

如果我以此开头:

const obj1 = {
    doSomething: () => {
        console.log('hello world 1');
    },
};

可以安全地缩短吗?这些是一样的吗?

const obj2 = {
    doSomething: () => console.log('hello world 2'),
};

这个为什么这么奇怪?

const obj3 = {
    doSomething: console.log('hello world 3'),
};

我注意到 obj3 会自行运行,无法执行 obj3.doSomething()

https://repl.it/JEGD/1

obj3.doSomething() 无法操作的原因是因为您正在将对象的 doSomething 属性 分配给 returned 值console.log(...)。由于 console.log 没有 return 任何东西,它只是执行并使 doSomething 为空。

obj1obj2 本质上是一样的。如果您要将 obj2 中的 console.log 替换为 (x) => x * x,那么 return 是隐含的并且不是必需的,但是像您一样围绕 {} 中的函数体在 obj1 中仍然需要使用 return 关键字。

1 和 2 几乎 相同。

当您在箭头的 RHS 上提供语句(而不是块)时,函数 return 是对该语句求值的结果。

在第一个例子中,函数returns undefined因为没有return语句。

在第二个例子中,函数returns undefined 因为console.log returns undefined.

这里没有实际区别,但在类似情况下可能会有区别。


至于第三个例子……

在情况 1 中,您使用函数表达式创建了一个函数。

在情况 2 中,您创建了一个带有箭头函数的函数。

在情况 3 中,您根本没有创建函数。

您立即console.log 并将其 return 值(正如我上面提到的,是 undefined)分配给 doSomething .