在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
当前回答
首先你必须访问MDN IIFE,现在关于这一点有几点
这是立即调用的函数表达式。当你的javascript文件从HTML中调用这个函数时立即调用。 这防止了在IIFE习惯用法中访问变量以及污染全局作用域。
其他回答
IIRC允许你创建私有属性和方法。
命名空间。JavaScript的作用域是函数级的。
我不敢相信没有一个答案提到隐含的全局变量。
(function(){})()构造不能防止隐含的全局变量,这对我来说是更大的问题,参见http://yuiblog.com/blog/2006/06/01/global-domination/
基本上,函数块确保你定义的所有依赖的“全局变量”都限制在你的程序中,它不保护你不定义隐式全局变量。JSHint或类似的文件可以提供关于如何防御这种行为的建议。
更简洁的var App ={}语法提供了类似级别的保护,并且可以在“公共”页面上包装在函数块中。(请参阅Ember.js或SproutCore了解使用此结构的库的真实示例)
至于私有属性,除非您正在创建一个公共框架或库,否则它们有点被高估了,但如果您需要实现它们,Douglas Crockford有一些很好的想法。
一个区别是,你在函数中声明的变量是局部的,所以当你退出函数时,它们就消失了,并且它们不会与其他或相同代码中的其他变量冲突。
(function(){
var foo = {
name: 'bob'
};
console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error
实际上,上面的函数将被视为没有名称的函数表达式。
用左右圆括号包装函数的主要目的是避免污染全局空间。
函数表达式中的变量和函数变成私有的(也就是说,它们在函数外部是不可用的)。