是否需要自行执行的JS函数?

时间:2013-09-10 07:09:20

标签: javascript

自行执行的函数有什么用?

(function(w,d) {...})(window, document);

为什么他们传递全局变量的窗口/文档?

6 个答案:

答案 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)

  

为什么他们传递全局函数的窗口/文档?

因此,函数范围windowdocument内部将wd可用。

其中一个常见的做法包括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();
          }
          ]
 }