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

Ale*_*rck 16 javascript

我是javascript的新手,我读到了模块模式以提供某种命名空间并拥有私有和公共成员,例如:

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

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

1. IIFE

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

2.正常功能

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

Initialize();
Run Code Online (Sandbox Code Playgroud)

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

简而言之:

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

Moh*_*man 14

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

有时你想namespace为你的变量创建一个.所以anonymous功能也可以帮助你.例如

(function($) {
    $.fn.pluginName = function(opt) {
        // implementation goes here...
    }
}(jQuery));
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,您可以安全地在代码中$用作jQuery同义词.

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

function myFunction() {
    // function code goes here.
}
myFunction();
Run Code Online (Sandbox Code Playgroud)

但是如果你定义它没有名称,那么它将不会创建任何全局变量,并且您的全局命名空间不会被污染.

(function myFunction() {
    // function code goes here.
}());
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,具有良好名称的函数有时是有用的,但是当您编写很多人将使用的库时,总是存在一个风险,即您编写的函数可能会被其他脚本中的函数覆盖. (6认同)
  • 确实,当您使用IIFE时,可以使用一个额外的变量名,但是我认为选择一个好名字的能力可以描述该功能,这样您就可以在不读取整个内容的情况下知道它的作用,这远远超过了所带来的好处。 (2认同)
  • 只是添加:即使您正在使用IIFE,良好的做法也是命名即ie(function foo(){console.log("Hii");})(); 这将在调试或记录时帮助您进行堆栈跟踪.另一个重要的一点是IIFE很有用,因为它们只有在被调用时才按需进入堆栈.因此,当我们调用IIFE时,它被加载,其范围被创建,一旦完成工作,如果在IIFE的任何属性上保持No Closure,它就会被释放.在后面的情况下,即不是IIFE方法首先它将被提升然后加载并将保留在内存中直到标签关闭 (2认同)