何时需要立即调用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中,变量的作用域是函数;因此,如果将其封装在函数中,可以避免全局名称空间污染。在您给出的示例中,不,可能没有任何理由这样做 然而,这种模式通常用于确保在全局级别上满足您所需的变量或函数
- 可以与其他库中可能定义的其他库隔离
- 因此是隐藏私有变量的有效方法
- 可以防止被其他库篡改
$(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
(而且没有人可以改变你的私有内部参数)。这只是一个组织问题?不,这更多的是一个适当的范围和私有变量保护问题。