javascript

时间:2016-12-19 18:31:59

标签: javascript closures iife

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

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

在上面的场景中,javascript引擎保留了age变量来执行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

在上述场景中,根据闭包概念,变量' greeting'和' fNameSpace1.name'将被存储以便将来执行callname()函数。相反,我们正在使用' window'宾语。如果我们有封闭,我很困惑为什么我们要使用窗口?

2 个答案:

答案 0 :(得分:0)

  

javascript中闭包与IIFE的区别

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

  

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

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

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

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

但同样,有许多不同的形式。该特定作者的作者更喜欢写window上的属性作为创建全局的方式。

答案 1 :(得分:0)

IIFE对于在多个函数访问全局变量时避免全局变量污染很有用

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