立即调用函数表达式(IIFE)对正常函数

时间:2016-05-04 07:37:56

标签: javascript

我是javascript的新手,我读到了the module pattern提供某种命名空间并拥有私人和公共成员,例如:

var module = (function() {
   var s = "Hello, i'm private and in closure!";
   return {
      myString : s,
      myFunc: function() { alert(s); }
   };
})();

看到了它的好处,因为它为您提供了面向对象编程的一些优势。但是我已经看到很多没有分配给变量的IIFE的例子。与你调用的普通函数相比,这(就我所见)没有任何优势:

1。 IIFE

(function() {
   var s = "Hello I'm private!";
   $('#myButton').on('click', function() {
      alert(s);
   });
})();

2。正常功能

function Initialize() {
   var s = "Hello I'm private!";
   $('#myButton').on('click', function() {
      alert(s);
   });
}

Initialize();

它们都有私有变量,可以避免创建全局变量,并且它们都可以在不向变量返回任何值的情况下执行。 虽然第二个让你可以选择一个好名字,而不是一个没有名字的潜在大型IIFE,让读者知道发生了什么。 The answer我看到everywhere '是为了避免命名空间污染“,但两种方法都是这样做的,第一种方法有点难以理解?

简而言之:

使用IIFE而不是我缺少的正常功能有什么好处?我为什么要使用它们?

1 个答案:

答案 0 :(得分:12)

有时您需要同时定义和调用函数,并且只需要一次,因此在这种情况下,匿名函数可以帮助您。在这种情况下,给函数命名然后调用它们只是过剩。

有时您还想为变量创建namespace。所以anonymous函数也可以帮助你。例如

(function($) {
    $.fn.pluginName = function(opt) {
        // implementation goes here...
    }
}(jQuery));

在上述情况下,您可以安全地在代码中使用$作为jQuery同义词。

如果您使用如下所示的名称定义函数,那么它将使用您定义的函数名创建全局变量。

function myFunction() {
    // function code goes here.
}
myFunction();

但如果你定义它没有名字,那么它就不会创建任何全局变量,你的全局命名空间也不会被污染。

(function myFunction() {
    // function code goes here.
}());

只有当您需要从代码中的不同位置调用时,带名称的函数才有用。