1

自我执行的功能有什么用?

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

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

4

6 回答 6

2

原因是:

  • 我们需要创建私有范围,在该函数中声明的所有内容都不会污染全局命名空间。
  • 使用较短的名称保持代码可读性。这是针对您的问题:为什么它们传递全局函数的窗口/文档?

更新:再添加 1 个原因

  • 创建闭包以捕获循环内的变量。

例如:

for (var i=0 ; i< count; i++ ){
  (function(index){
   //do something with current index
  })(i);
}

这通常是当您需要在循环完成后稍后执行某些操作并且仍然需要引用 index 时的情况。就像为对象列表附加点击事件处理程序或使用setTimeout

奖金:

由于自执行函数能够创建私有范围。出现了 Javascript 模块设计模式。该模式的想法是为您的私有变量和方法(真正私有)创建一个私有范围,只有避免污染全局范围所需的公共事物

于 2013-09-10T07:11:42.113 回答
1

自我执行的功能有什么用?

这是一个匿名函数,会立即被调用。这样做的目的是,如果不需要从其他任何地方调用该函数,您就不会使用随机名称来混淆命名空间。此类函数通常用作回调或事件处理程序。

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

在带有 FRAME 或 IFRAME 标签的页面中,或弹出/在新窗口中打开的页面中,可能有多个窗口和文档。

于 2013-09-10T07:13:13.357 回答
1

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

因此,在该函数范围内windowdocument将可用作wd

jQuery 插件开发中包含的一种常见做法是:

(function($) {
   //...
})(jQuery); 

由于$也可以在原型中使用,因此在混合两个库时可以创建异常,但在上面的函数内部,$将只表示 jQuery 而不是原型。

于 2013-09-10T07:13:38.577 回答
1

这个想法是您传递全局变量的副本,因此您在自执行函数范围内所做的任何更改都不会影响外部引用。它还允许您在该函数中声明不会与现有变量冲突的全局变量。

简而言之,这里的目标是限制范围。

于 2013-09-10T07:14:55.723 回答
1

自执行函数也称为立即调用函数表达式(IIFE),具有多种用途。最常见的是:

Prevent pollution (using closure)

将所有代码封装到函数范围内以避免乱扔全局命名空间是一种更好的做法。“在函数中定义的变量和函数只能在该上下文内部访问,而不能在该上下文外部访问,调用函数提供了一种创建隐私的非常简单的方法。” 关联

Class-based inheritance design: 

JavaScript 具有原型继承。但是很多基于类的自定义实现都使用自执行函数[1]

传递全局和窗口对象以便于引用。这些对象属性的变化也反映在外部。. 您对 w 和 d 所做的更改确实反映/改变了外部。这些局部变量仅仅是对全局窗口和文档的引用。因此,在函数范围内进行的更改将进行全局更改![小提琴]

于 2013-09-10T07:31:05.937 回答
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();
          }
          ]
 }
于 2013-09-10T07:13:22.587 回答