【问题标题】:Difference between closures and IIFE's in javascriptjavascript中闭包和IIFE的区别
【发布时间】:2016-12-19 18:31:58
【问题描述】:

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

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 引擎保存,以执行返回方法中存在的内部函数。

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

【问题讨论】:

  • 最后那个fNameSpace1.callName(); 会失败。全局称为doer,而不是fNameSpace1
  • 不清楚你在问什么。如果问题是“闭包和 IIFE 之间有什么区别”,那么答案是“IIFE 是创建闭包的一种特定方式”。如果问题是“如果我们关闭,为什么我们要使用窗口?”答案是:因为作者想要一个全局变量。
  • 我的问题是如果javascript引擎已经存储了fNameSpace1对象,那么window对象在这种情况下的确切用途是什么。为什么我们要使用window创建引用?

标签: javascript closures iife


【解决方案1】:

当多个函数访问一个全局变量时,IIFE 有助于避免全局变量污染

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

【讨论】:

    【解决方案2】:

    javascript 中闭包和 IIFE 的区别

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

    我的问题是,如果 javascript 引擎已经存储了 fNameSpace1 对象,那么在这种情况下 window 对象的确切用途是什么。为什么我们要使用 window 创建引用?

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

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

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

    但同样,有几十种不同的阵型。那个特定的作者只是更喜欢写入window 上的属性作为创建全局的方式。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 2013-07-10
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2010-10-22
      相关资源
      最近更新 更多