Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
闭包和IIFE之间的差异';javascript中的s_Javascript_Closures_Iife - Fatal编程技术网

闭包和IIFE之间的差异';javascript中的s

闭包和IIFE之间的差异';javascript中的s,javascript,closures,iife,Javascript,Closures,Iife,根据闭包概念,它将存储外部词汇环境的变量,以便将来执行其内部函数。例如: function makeYounger(age) { function b() { console.log("Original age is :" + age); } b(); return(function() { return age / 2; }); } var displayAge = makeYounger(20); consol

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

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

人生来了:

 (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
在上述场景中,根据闭包概念,变量
greeting
fNameSpace1.name
将被存储,以便将来执行
callname()
函数。相反,我们使用的是
窗口
对象。我很困惑,如果我们有闭包,为什么要使用
窗口

javascript中闭包和IIFE的区别

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


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

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

有几十种不同的方法可以做到这一点。其中一个是这样分配给
窗口的。另一种方法是返回值并使用
var
语句:

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

但是,这里有几十种不同的构造。该特定函数的作者更喜欢在
窗口中写入属性,作为创建全局变量的方法。

iLife在多个函数访问全局变量时有助于避免全局变量污染


使用局部变量时,闭包函数很有用。

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