我什么时候需要立即调用javascript匿名函数?

时间:2012-01-27 14:19:50

标签: javascript var

我认为没有需要这个的情况

(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”将在匿名函数的范围内被忽略?

4 个答案:

答案 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(){})()块中意味着您知道一旦函数执行完毕就会清理它。