高级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引用 ,也讨论了匿名函数。