在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
在javascript中,什么时候你想使用这个:
(function(){
//Bunch of code...
})();
在这:
//Bunch of code...
当前回答
是否有一个参数和“一串代码”返回一个函数?
var a = function(x) { return function() { document.write(x); } }(something);
关闭。something的值被赋给a的函数使用。something可以有一些变化的值(for循环),每次a都有一个新函数。
其他回答
我不敢相信没有一个答案提到隐含的全局变量。
(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
实际上,上面的函数将被视为没有名称的函数表达式。
用左右圆括号包装函数的主要目的是避免污染全局空间。
函数表达式中的变量和函数变成私有的(也就是说,它们在函数外部是不可用的)。
命名空间。JavaScript的作用域是函数级的。
自调用函数在javascript:
自动调用(启动)自调用表达式,而不需要调用。自调用表达式在创建后立即被调用。这主要用于避免命名冲突以及实现封装。变量或声明的对象在此函数之外不可访问。为了避免最小化(filename.min)的问题,总是使用自执行函数。
IIRC允许你创建私有属性和方法。