在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
当前回答
此方法用于闭包。有关闭包的更多信息,请阅读此链接。
其他回答
IIRC允许你创建私有属性和方法。
我不敢相信没有一个答案提到隐含的全局变量。
(function(){})()构造不能防止隐含的全局变量,这对我来说是更大的问题,参见http://yuiblog.com/blog/2006/06/01/global-domination/
基本上,函数块确保你定义的所有依赖的“全局变量”都限制在你的程序中,它不保护你不定义隐式全局变量。JSHint或类似的文件可以提供关于如何防御这种行为的建议。
更简洁的var App ={}语法提供了类似级别的保护,并且可以在“公共”页面上包装在函数块中。(请参阅Ember.js或SproutCore了解使用此结构的库的真实示例)
至于私有属性,除非您正在创建一个公共框架或库,否则它们有点被高估了,但如果您需要实现它们,Douglas Crockford有一些很好的想法。
这都是关于变量作用域的。默认情况下,在自执行函数中声明的变量仅可用于自执行函数中的代码。这允许编写代码时不考虑变量在其他JavaScript代码块中的命名方式。
例如,正如Alexander在评论中提到的:
(函数(){ Var foo = 3; console.log (foo); }) (); console.log (foo);
这将首先记录3,然后在下一个console.log上抛出一个错误,因为foo没有定义。
可能是范围隔离。这样函数声明中的变量就不会污染外部命名空间。
当然,在一半的JS实现中,它们都是如此。
首先你必须访问MDN IIFE,现在关于这一点有几点
这是立即调用的函数表达式。当你的javascript文件从HTML中调用这个函数时立即调用。 这防止了在IIFE习惯用法中访问变量以及污染全局作用域。