将括号单独放在函数周围意味着什么? (函数(){})

时间:2017-08-24 13:32:19

标签: javascript function

我知道立即调用的函数表达式是什么。我知道这个

之间的区别
let x = function()
{

}

和这个

let x = (function()
{

})()

但是这个呢?

let x = (function()
{

})

这里的括号是否有任何意义?我以前在好几个地方见过它。

I thought this was an example but it might not be one X)

编辑那些并不是真正意图成为代码片段,无论如何假设它们是片段,事实证明它们是函数声明和函数表达式之间存在很大差异。我没想到这一点。对于上下文变更感到抱歉,感谢所有的关心!

4 个答案:

答案 0 :(得分:5)

回答编辑过的问题:

  

但是这个呢?

let x = (function()
{

})

()根本没有任何目的。这完全相同:

let x = function()
{

}

回答评论中嵌入的问题

a comment你说过你真的想知道这件事:

let foo = () => ({ bar: { foo: 1, bar: 2, } });

()是必要的,因为这是一个带有简洁主体的箭头函数,返回对象初始值设定项的结果。但是如果在{之后紧跟=>,则{将是块(详细)主体的开头(而不是对象初始化器的开头)。这就是为什么在简洁箭头的表达主体周围需要(),以消除{的歧义。

请注意,函数周围的() ;只是它的身体。

您可以按照以下方式编写:

let foo = () => ({ bar: { foo: 1, bar: 2, } });

{}return

let foo = () => { return { bar: { foo: 1, bar: 2, } } };

但不是:

let foo = () => { bar: { foo: 1, bar: 2, } }; // Wrong

因为{将被视为块体的开头。

回答original question

我将假设它们具有名称,否则您的第一个示例是语法错误。

  

但是这个呢?

(function()
{

})

这将是不是立即调用的函数表达式。与第一个示例不同,它是在逐步执行到达它时进行评估的,而不是在最初创建它的上下文时进行评估。

除非某些东西正在使用该表达式的结果,否则它是一个无操作(无效的东西),因为表达式中的任何内容都不会运行它。

如果使用表达式的结果(它是赋值的右侧,它将作为参数传递给函数等),()围绕它是不必要的function表达式。 (箭头功能并非总是如此。)

答案 1 :(得分:3)

鉴于the original question

其他条件相同(可能不是因为你省略了上下文):

  1. 这是语法错误。它从函数声明开始,然后不符合语法要求。
  2. 这是一个立即调用的函数表达式。
  3. 括号使其成为函数表达式(就像在示例2中一样)。它没有被调用(最后遗漏了()。它没有分配到任何地方。它什么都不做。
  4. 但是现在你已经改写了这个问题,完全改变了意思。

    实施例3和实施例1现在是相同的。

    在表达式周围放置)org.apache.commons.cli.CommandLine#getArgList()除了覆盖运算符优先级之外什么都不做......并且它们内部没有运算符。

答案 2 :(得分:1)

(function() {})function() {}之间没有区别。

这一行也是一样的:

var test1 = (function() {});
var test2 = function() {};

但是,如果你只写这个:

function() {};

您将收到语法错误。如果您不想要语法错误,则必须写下:

(function() {});

但是这条线没用,什么都不做。因为从未调用定义的函数,所以没有人可以访问它。

答案 3 :(得分:-1)

以这种方式将函数括在括号中,可以将其打包以用于另一个变量或函数。

例如,您可以使用此(有点冗余)将变量设置为函数。

var foo = (function bar() { /* code */ });
foo(); // calls code in bar()

这也是打包回调函数的一种方法,例如

asyncFunction((function callback() { /* code */ });

您不希望自己使用这种类型的声明,因为它会对您的其余代码隐藏,如下例所示。

function foo() { /* code */ };
(function bar() { /* code */ });

foo(); // runs foo code
bar(); // ERROR - bar() undefined in this scope

类似的语法与"立即调用的函数表达式"中的尾随括号一起使用。这会将变量传递给您的函数并以内联方式运行。

(function foo(a) { console.log(a) })("Hello World!");
// Prints "Hello World"

TL; DR - 将其用作内联编写命名函数的方法,并将其打包到另一个函数或变量中,或者使用尾随括号,使用指定的输入立即调用函数。< / p>