为什么在此函数中大括号之外有括号,这意味着什么?

时间:2018-09-28 04:20:28

标签: javascript function

我在GraphQL-related post中遇到了以下代码。 为什么在fields参数中大括号之外有括号,这是什么意思?

var PersonType = new GraphQLObjectType({
  name: 'Person',
  fields: () => ({
    name: { type: GraphQLString },
    bestFriend: { type: PersonType },
  })
});

以下是我知道的函数表达式/声明:

标准命名功能

function sayHello() {
    alert("hello!");
};

ES6匿名功能

() => {
    alert("hello!");
};

自调用功能

(function sayHello() {
    alert("hello!");
})();

自调用ES6匿名功能

(() => {
    alert("hello!");
})();

据我所知,fields函数不适合以上任何一项。

3 个答案:

答案 0 :(得分:2)

使用括号可以使函数返回对象,而不必用return将整个对象括在括号中。

例如,该无效不起作用:

var PersonType = new GraphQLObjectType({
  name: 'Person',
  fields: () => {                  // interpreted as a block not an object
    name: { type: GraphQLString },
    bestFriend: { type: PersonType },
  }
});

因为当您要返回对象时,{}将被解释为一个块。

您可以这样做:

var PersonType = new GraphQLObjectType({
  name: 'Person',
  fields: () => {
    return { name: { type: GraphQLString },
             bestFriend: { type: PersonType },
           }
  }
});

但这似乎不如仅使用括号来使函数返回对象好。

答案 1 :(得分:2)

返回的对象用'()'括起来,因此花括号不是函数体,而是对象。

答案 2 :(得分:1)

如果没有括号,它将是什么样?

fields: () => {
  name: { type: GraphQLString },
  bestFriend: { type: PersonType },
}

看起来非常像功能块语法。实际上,这就是解释器所假定的,然后当他们看到期望标准表达式的奇怪的key: value语法时,便抛出语法错误。

换句话说,括号中的内容表示函数返回一个对象,并且花括号不应解释为包含代码块。