我知道立即调用的函数表达式是什么。我知道这个
之间的区别let x = function()
{
}
和这个
let x = (function()
{
})()
但是这个呢?
let x = (function()
{
})
这里的括号是否有任何意义?我以前在好几个地方见过它。
I thought this was an example but it might not be one X)
编辑那些并不是真正意图成为代码片段,无论如何假设它们是片段,事实证明它们是函数声明和函数表达式之间存在很大差异。我没想到这一点。对于上下文变更感到抱歉,感谢所有的关心!
答案 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
因为{
将被视为块体的开头。
我将假设它们具有名称,否则您的第一个示例是语法错误。
但是这个呢?
(function() { })
这将是不是立即调用的函数表达式。与第一个示例不同,它是在逐步执行到达它时进行评估的,而不是在最初创建它的上下文时进行评估。
除非某些东西正在使用该表达式的结果,否则它是一个无操作(无效的东西),因为表达式中的任何内容都不会运行它。
如果使用表达式的结果(它是赋值的右侧,它将作为参数传递给函数等),()
围绕它是不必要的function
表达式。 (箭头功能并非总是如此。)
答案 1 :(得分:3)
其他条件相同(可能不是因为你省略了上下文):
(
)。它没有分配到任何地方。它什么都不做。但是现在你已经改写了这个问题,完全改变了意思。
实施例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>