javascript 中闭包和 IIFE 的区别

Difference between closures and IIFE's in javascript

根据闭包的概念,它将存储外部词法环境的变量,以供将来执行其内部功能。例如:

function makeYounger(age) {
    function b() { 
        console.log("Original age is :" + age); 
    }
    b();
    return(function() { 
        return age / 2;
    }); 
}
var displayAge = makeYounger(20); 
console.log(displayAge());

在上述场景中,age 由 Javascript 引擎保留以执行 return 方法中存在的内部函数。

IIFE 来了:

 (function(window) { 
     var greeting = "Hello"; 
     var fNameSpace1 = { 
         name : "Appu", 
         callName : function() { 
             console.log(greeting + fNameSpace1.name);
         } 
     };
     window.doer = fNameSpace1; 
 }) (window);

 fNameSpace1.callName(); //To execute the inner function

在上述场景中,根据闭包概念,变量 greetingfNameSpace1.name 将被存储以供将来执行 callname() 函数。相反,我们正在使用 window 对象。我很困惑为什么我们要使用 window 如果我们有闭包?

Difference between closures and IIFE's in javascript

IIFE 只是 A) 在其定义的上下文中创建闭包,以及 B) 创建用于创建其他闭包的上下文的一种特定方法。

My question is what is the exact use of window object in this scenario if the javascript engine already stores fNameSpace1 object.Why are we creating a reference using window?

所以它可以在 IIFE 之外使用,通过 window.doer = ... 创建的 doer 全局引用它。

有许多不同的方法可以做到这一点。其中之一是通过像那样分配给 window 来实现的。另一个通过返回值并使用 var 语句来实现:

var doer = (function() {
   // ...
   return fNamespace1;
})();

但同样,有数十种不同的编队。那个特定的作者只是更喜欢在 window 上写一个 属性 作为创建全局的方式。

IIFE 可用于在多个函数访问一个全局变量时避免全局变量污染

闭包函数在处理局部变量时很有用。