高级Javascript:为什么这个函数用圆括号包装?

可能重复:
JavaScript中的这个构造是什么?

我碰到这一点的Javascript代码,但不知道该怎么做。 为什么我运行这个代码时会得到“1”? (1)这个奇怪的小附录是什么,为什么这个函数是用括号括起来的?

(function(x){ delete x; return x; })(1); 

谢谢 :-)

这里有几件事情正在进行。 首先是立即调用的函数expression式 (IIFE)模式:

 (function() { // some code })(); 

这提供了一个在自己的范围内执行一些JS代码的方法。 它通常用于使函数中创build的任何variables不会影响全局范围。 你可以用它来代替:

 function foo() { // some code } foo(); 

但是这需要给函数一个名字,这并不总是必要的。 使用命名函数也意味着在将来某个时候,函数可能会被再次调用,这可能是不可取的。 通过以这种方式使用匿名函数,您可以确保只执行一次。

这个语法是无效的:

 function() { // some code }(); 

因为你必须把这个函数包装在parens中,才能把它parsing为一个expression式。 更多信息在这里: http : //benalman.com/news/2010/11/immediately-invoked-function-expression/

所以快速回顾IIFE模式

 (function() { // some code })(); 

允许“一些代码”立即执行,就好像它只是内联编写的一样,但也可以在其自己的范围内,以免影响全局名称空间(从而可能干扰或受到其他脚本的干扰)。

你可以传递参数给你的函数,就像你正常的函数一样,例如

 (function(x) { // some code })(1); 

所以我们将值“1”作为第一个parameter passing给函数,该函数将其作为一个名为x的本地作用域variables接收。

其次,你有自己的function代码的胆量:

 delete x; return x; 

删除操作符将从对象中删除属性。 它不会删除variables。 所以;

 var foo = {'bar':4, 'baz':5}; delete foo.bar; console.log(foo); 

结果在这里被logging:

 {'baz':5} 

然而,

 var foo = 4; delete foo; console.log(foo); 

将logging值4,因为foo是一个variables而不是属性,所以它不能被删除。

许多人认为删除可以删除variables,因为autoglobals的工作方式。 如果您在未声明variables的情况下将variables赋值给variables,则variables实际上不会成为variables,而是全局对象上的属性:

 bar = 4; // note the lack of 'var'. Bad practice! Don't ever do this! delete bar; console.log(bar); // error - bar is not defined. 

这一次删除工作,因为你不是删除一个variables,而是全局对象的属性。 实际上,以前的代码片段相当于这个:

 window.bar = 4; delete window.bar; console.log(window.bar); 

现在你可以看到它是如何与foo对象的例子类似,而不是foovariables的例子。

这意味着你创build了一个匿名函数,并用参数1调用它。

它和以下一样:

 function foo(x) { delete x; return x; } foo(1); 

人们通常称这些“立即调用函数expression式”或“自执行函数”。

这样做的关键是在函数中声明的variables不会泄露到外部。

您仍然得到1返回的原因是, 删除关键字是用于删除对象的属性 。 剩下的就像其他人所说的那样,括在括号中的任何东西都会作为一个函数来执行,而第二组括号是传递给这个块的参数。

这里是MDN的删除引用 ,还有关于闭包的MDN引用 ,也讨论了匿名函数。