我们何时必须在ES6箭头函数中使用()和{}

时间:2019-06-13 01:59:36

标签: javascript function ecmascript-6

我对箭头功能中可互换使用的括号和花括号感到困惑。

例如,

花括号的使用

def build_model(some_arguments...):
    with tf.device('/gpu:0'):
      ~~
      ~~
      cell_forward = GRUCell(some_other_arguments...)

括号的使用

const sayHello = () => { console.log('Hello') }

两者在控制台上都提供相同的输出。两者的意思都一样吗?抱歉,这个问题听起来很蠢。

2 个答案:

答案 0 :(得分:2)

使用花括号(花括号)时,它定义了函数主体-因此,您可以在其中放置多个用分号分隔的语句。如果希望从函数返回值,则必须显式使用return语句。

如果使用括号,则将返回括号内表达式的值,并且只能有一个表达式(无分号)。如果您想用括号做很多事情,可以使用逗号运算符:

const doTwoThings = () => (console.log("Hello"), console.log("Goodbye"));
console.log(doTwoThings());

在这里,您先记录Hello,然后记录Goodbye,然后记录函数的返回值-undefined

您可以在花括号内执行相同的操作,并且看不到任何明显的区别:

const doTwoThings = () => {console.log("Hello"), console.log("Goodbye")};
console.log(doTwoThings());

再次将HelloGoodbye记录到控制台,然后再记录函数的返回值-但是,使用{}必须具有显式的{{ 1}}关键字,所以它是return,因为我们没有从函数中返回任何内容。

还要注意,有时您会同时看到括号大括号:

undefined

有一个很好的解释here,但是基本上,当您有一个返回对象的函数时,大括号const aFunction = () => ({ foo: "bar" }); console.log(aFunction());表示该对象,括号强制隐含地返回所包含的表达式-该对象。这样就创建了对象,然后对表达式求值并返回。

答案 1 :(得分:0)

当您使用“花括号”时,就好像您在定义一个普通函数一样,照常具有多个语句。在您的示例中,它运行console.log('Hello')并且不返回任何内容。使用括号时,只能指定一个表达式,然后该表达式的结果将成为返回值。换句话说,=> (bar)=> { return bar; }基本相同。两种情况在您的情况下都是一样的,因为您只是使用该函数来产生副作用,而不关心其返回值。