2017-08-24 33 views
-2

我知道什么是立即调用的函数表达式。我知道这个围绕函数放置括号是什么意思? (function(){})

let x = (function() 
{ 

}) 

let x = function() 
{ 

} 

let x = (function() 
{ 

})() 

,但区别在哪做的括号在这里有单独什么意义?我以前在几个地方见过它。

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

编辑:这些并没有真正意图是代码片段,总之,只要他们的片段,原来有,他们是函数的声明和函数表达式的情况差别大。我没有想到这一点。对于上下文更改感到抱歉,并感谢所有的关心!

+1

你发布的链接中提到了'(function(){})'? – Xufox

+0

这一个:'让富=()=>({ 栏:{ FOO:1, 栏:2, } });'@Xufox –

+0

必须有更多的这个比你所示。如图所示,第一个例子是语法错误,最后一个例子完全没有意义。 –

回答

5

答案给编辑的问题:

but what about this

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

我将承担这些有名字,否则你的第一个例子是一个语法错误。

but what about this

(function() 
{ 

}) 

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

除非有什么东西在使用该表达式的结果,否则它是一个无操作(无所事事),因为表达式中没有任何东西运行它。

如果表达式的结果是正在使用(它是一个赋值语句的右边,它被传递给函数作为参数等),它周围的()是不必要与function表达。 (这并不总是带有箭头的功能的情况下)。

1

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

此行也是相同的:

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

但是,如果你只写:

function() {}; 

你会得到一个语法错误。如果你不希望一个语法错误,你必须这样写:

(function() {}); 

,但此行是无用的,什么都不做。因为定义的功能从来没有被调用,也没有人可以访问它。

+0

那么,如果**是**,那么它就是预计发表声明的地方。 –

+0

哦,是的,我明白你的意思 – Magus

3

鉴于the original question

所有其他条件相同的(很可能是不是因为你忽略上下文):

  1. 这是一个语法错误。它从一个函数声明开始,然后不符合语法要求。
  2. 这是一个立即调用的函数表达式。
  3. 括号使这成为一个函数表达式(就像例2)。它没有被调用(最后缺少())。它没有分配到任何地方。它什么也没做。

但是现在你已经重写的问题,并彻底改变了意义。

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

()围绕一个表达式除了覆盖运算符优先级之外什么都不做,而且里面没有任何运算符。

+0

以及它不是一个语法错误 –

+1

嗯,它是。去尝试一下。 –

+0

@MinaMichael:如图所示,第一个是。我想,你已经删除了太多的背景。 –

-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 - 使用它作为一种方法来写一个叫内联函数,并将其包装成另一个函数或变量,或尾随括号,按指定的输入立即打电话给你的函数。

相关问题