自行执行的函数有什么用?
(function(w,d) {...})(window, document);
为什么他们传递全局变量的窗口/文档?
答案 0 :(得分:2)
原因是:
更新:再添加1个原因
例如:
for (var i=0 ; i< count; i++ ){
(function(index){
//do something with current index
})(i);
}
在循环结束后需要稍后在 上执行某些操作并且仍需要引用索引 时,通常会出现这种情况。比如为对象列表附加click事件处理程序或使用setTimeout
加分:
由于自执行功能创建私有范围的能力。来Javascript module design pattern。模式的想法是为您的私有变量和方法创建一个私有范围( 真正私有 ),只需要避免污染全局范围的公共事物
答案 1 :(得分:1)
自行执行的函数有什么用?
这是一个匿名函数,可以立即调用。这样做的目的是,如果不需要从其他任何地方调用该函数,则不要使用随机名称来混淆命名空间。这些函数通常用作回调或事件处理程序。
为什么他们传递全局函数的窗口/文档?
在包含FRAME或IFRAME标记的页面或弹出/打开新窗口页面中,可能有多个窗口和文档。
答案 2 :(得分:1)
为什么他们传递全局函数的窗口/文档?
因此,函数范围window
和document
内部将w
和d
可用。
其中一个常见的做法包括jQuery插件开发:
(function($) {
//...
})(jQuery);
由于$
也可以在原型中使用,这可以在混合两个库时创建一个混合,但在上面的函数中,$
将只代表jQuery而不是原型。
答案 3 :(得分:1)
您的想法是传递全局变量的副本,因此您在自执行函数范围内更改的任何内容都不会影响外部引用。它还允许您在该函数中声明不会与现有变量冲突的全局变量。
简而言之,这里的目标是限制范围。
答案 4 :(得分:1)
自执行功能也称为立即调用函数表达式(IIFE),具有多种用途。最常见的是:
Prevent pollution (using closure)
更好的做法是将所有代码封装到函数范围中,以避免乱丢全局命名空间。 “函数中定义的变量和函数只能在内部访问,但不能在外部访问,调用函数提供了一种非常简单的方法来创建隐私。”link
Class-based inheritance design:
JavaScript具有原型继承。但是许多基于类的自定义实现都在那里使用自执行函数[1]
传递全局和窗口对象以便于引用。 对这些对象属性的更改也反映在外面。。您对w和d所做的更改会在外部反映/更改。这些局部变量仅仅是对全局窗口和文档的引用。因此,在功能范围内进行的更改将进行全局更改! [fiddle]
答案 5 :(得分:0)
这些匿名函数用作闭包函数或集合返回函数,可以访问在公共父函数闭包中声明的一组常见捕获变量,而不会污染全局命名空间并传递它们。
非常基本的例子:
keepsTrackOfTimesUsedWithoutPollutingNamespace = function()
{
var right = 0;
var left = 0;
display = function(){console.log("right got executed " +right+" times and left got executed " + left +" times.\n";}
return [
function()
{
right += 1;
display();
},
function()
{
left += 1;
display();
}
]
}