立即调用的函数表达式(IIFE)与未

问题描述:

我看到很多代码,如:立即调用的函数表达式(IIFE)与未

var myApp ={}; 
(function() { 
    console.log("Hello"); 
    this.var1 = "mark";  //"this" is global, because it runs immediately on load. Caller is global 
    myApp.sayGoodbye = function() { 
     console.log("Goodbye"); 
    }; 
})(); 

导致匿名函数立即执行。但是,与仅将内联代码相比,这有什么优势?

var myApp ={}; 
console.log("Hello"); 
var1 = "mark";  
myApp.sayGoodbye = function() { 
    console.log("Goodbye"); 
}; 

显然,这是一个与功能的范围内做的,但作为函数是匿名的,并呼吁通过窗口,它的范围(即this)是全球性的,不是吗?

+0

在第二个片段中,var1附加到窗口范围,第一个不是。 – mpm

+0

但是当我用Chrome浏览示例1时,'var1'是全局的。 – Mark

+0

这个结构的原因不在我们看到的代码中。或者它完全没用。请向我们展示更多代码。 –

通常情况下,你会这样:

 var myApp ={}; 
     (function() { 
      console.log("Hello"); 
      var var1 = "mark"; 
      myApp.sayGoodbye = function() { 
       console.log("Goodbye"); 
      }; 
     })(); 

的主要区别是,var1不扰乱全局命名空间。此次通话后,var1仍然与以前相同(通常未定义)。

由于var1只能从闭包中定义的函数来访问,所以它被称为“私有”。

除了避免可能的冲突原因之外,只是在不使用全局变量时不保留全局变量。

在这里,您没有局部变量,而是全局变量,其定义为this.var1。这可能是一个错误,或者原因会在代码的其他地方找到。

+0

谢谢,我认为这是最接近的解释。只要'var'声明了anon fn中的变量,它们就不会泄漏到全局名称空间中。我发现JavaScript中的'this'的定义非常混乱! – Mark

一个原因:将代码封装在匿名函数中允许您创建一个模块,该模块将公共API与私有函数以及仅在模块内部使用的变量区分开来。这可以避免污染全局名称空间。

var myApp ={}; 
(function() { 
    console.log("Hello"); 
    this.var1 = "mark"; 

    function helper() {/*Some code here*/;} 

    myApp.sayGoodbye = function() { 
     helper() 
     console.log("Goodbye"); 
    }; 
})(); 

我可以说:

var myApp ={}; 
console.log("Hello"); 
var var1 = "mark"; 

function helper() {/*Some code here*/;} 

myApp.sayGoodbye = function() { 
    helper() 
    console.log("Goodbye"); 
}; 

但随后在全球范围内包含了一个叫做helper函数,它是没有用的,使用你的模块的人,并可能导致与其他模块可能的命名冲突。

我可以选择仅包含helper作为myApp的一种方法。

var myApp ={}; 
console.log("Hello"); 
var var1 = "mark"; 

myApp.helper = function() {/*Some code here*/;} 

myApp.sayGoodbye = function() { 
    this.helper() 
    console.log("Goodbye"); 
}; 

不过,我可能希望防止用户直接调用helper,在这种情况下,这不会做。