我认为没有需要这个的情况
(function(param){
alert(param);
//do something
})("derp");
取而代之的是
alert("derp");
//do something
编辑:好的,谢谢大家,我想我明白了。
如果你有这个:
var param = "x";
var heya = "y";
(function(param){
alert(param);
//do something
})(heya);
全局变量“param”将在匿名函数的范围内被忽略?
答案 0 :(得分:3)
这种情况怎么样?
示例#1 - 使用立即调用的函数表达式,该表达式关闭单个变量并返回另一个函数。从而产生了美丽的包容功能。
var tick = (function () {
//Example of function expression + closure
var tock = 0;
return function() {
return ++tock;
}
}());
//It is impossible to alter `tock` other than using tick()
tick(); //1
tick(); //2
tick(); //3
tick(); //4
<强> VERSUS 强>
示例#2 - 使用具有全局变量的函数声明
//Unnecssary global (unless wrapped in another function, such as jQuery's ready function)
var tock = 0;
function tick() {
return ++tock;
}
tick(); //1
tock = 4; //tock is exposed... and can be manipulated
tick(); //5
tock = 6;
tick(); //7
这是一个人为的例子,但在人们可能想要生成连续的UNIQUE ID并且不存在碰撞的情况下仍然是一个真实的情况。
答案 1 :(得分:1)
嗯,你没有 - 对于这个简单的例子。
在JavaScript中,变量的作用域是函数;因此,如果将其包装在函数中,则可以避免全局命名空间污染。
答案 2 :(得分:1)
嗯,在你给出的例子中,不,你可能没有任何理由这样做。
但是,这种模式通常用于确保全局级别所需的变量或函数
Javascript中的Globals是邪恶的。
特别是,在使用jQuery时,我会经常将$(callback(){})
括在这样的函数中,这样我就可以在回调本身内部获得jQuery代码的全局状态,通常是因为我有其他代码不一定依赖于jQuery就绪初始化:
function(){
var something = 'something';
$(function(){
something = 'jQuery bound';
});
}();
答案 3 :(得分:0)
除了污染全局命名空间之外,内存使用是执行此操作的另一个原因 - 如果您正在引入仅使用一次的大数据结构,将其包装在(function(){})()块中意味着您知道一旦函数执行完毕就会清理它。