我对箭头功能中可互换使用的括号和花括号感到困惑。
例如,
花括号的使用
def build_model(some_arguments...):
with tf.device('/gpu:0'):
~~
~~
cell_forward = GRUCell(some_other_arguments...)
括号的使用
const sayHello = () => { console.log('Hello') }
两者在控制台上都提供相同的输出。两者的意思都一样吗?抱歉,这个问题听起来很蠢。
答案 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());
再次将Hello
和Goodbye
记录到控制台,然后再记录函数的返回值-但是,使用{}
必须具有显式的{{ 1}}关键字,所以它是return
,因为我们没有从函数中返回任何内容。
还要注意,有时您会同时看到括号和大括号:
undefined
有一个很好的解释here,但是基本上,当您有一个返回对象的函数时,大括号const aFunction = () => ({ foo: "bar" });
console.log(aFunction());
表示该对象,括号强制隐含地返回所包含的表达式-该对象。这样就创建了对象,然后对表达式求值并返回。
答案 1 :(得分:0)
当您使用“花括号”时,就好像您在定义一个普通函数一样,照常具有多个语句。在您的示例中,它运行console.log('Hello')
并且不返回任何内容。使用括号时,只能指定一个表达式,然后该表达式的结果将成为返回值。换句话说,=> (bar)
与=> { return bar; }
基本相同。两种情况在您的情况下都是一样的,因为您只是使用该函数来产生副作用,而不关心其返回值。