何时需要立即调用javascript匿名函数?

何时需要立即调用javascript匿名函数?,javascript,var,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); 在匿名函数

我看不出在什么情况下我需要这个

(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”将被忽略?

好吧,您没有忽略-对于这个简单的示例


在JavaScript中,变量的作用域是函数;因此,如果将其封装在函数中,可以避免全局名称空间污染。

在您给出的示例中,不,可能没有任何理由这样做

然而,这种模式通常用于确保在全局级别上满足您所需的变量或函数

  • 可以与其他库中可能定义的其他库隔离
    • 因此是隐藏私有变量的有效方法
  • 可以防止被其他库篡改
Javascript中的全局变量是邪恶的

特别是,在使用jQuery时,我经常将
$(callback(){})
封装在这样的函数中,这样我就可以在回调本身中拥有我不想要的jQuery代码的全局状态,这通常是因为我有其他不一定依赖于jQuery就绪初始化的代码:

function(){
  var something = 'something';
  $(function(){
    something = 'jQuery bound';
  });
}();

这个场景怎么样

示例#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

示例#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

这是一个人为的例子,但在人们可能希望生成连续的唯一ID而不可能发生冲突的情况下,这仍然是一个真实的场景。

除了污染全局名称空间之外,内存使用也是这样做的另一个原因-如果你要引入一个只使用一次的大数据结构,将其包装成一个(function(){})()块意味着您知道一旦函数完成执行,它将被清除。

关于匿名函数的问题-每个编辑可能重复,是的,您是正确的。param==heya在@melanke的范围内,是的,您的全局
param
将不会被内部
param
(而且没有人可以改变你的私有内部
参数)。这只是一个组织问题?不,这更多的是一个适当的范围和私有变量保护问题。