即时函数JavaScript

即时函数JavaScript,javascript,function,iife,Javascript,Function,Iife,Stoyan Stefanov在JavasScript Patterns中说:“您需要一个直接函数将所有代码包装在其局部范围内,而不将任何变量泄漏到全局范围内。”第70页 这是他的例子 (function() { var days = ['Sun','Mon']; // ... // ... alert(msg); }()); 但肯定是因为days被定义为一个var,所以它只是一个功能范围?立即函数的唯一好处是可以立即调用该函数。没有范围优势。correct?在

Stoyan Stefanov在JavasScript Patterns中说:“您需要一个直接函数将所有代码包装在其局部范围内,而不将任何变量泄漏到全局范围内。”第70页

这是他的例子

(function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
}());

但肯定是因为days被定义为一个var,所以它只是一个功能范围?立即函数的唯一好处是可以立即调用该函数。没有范围优势。correct?

在函数范围中包含您的
days
变量正是示例所要说明的要点。如果没有立即调用的函数,所有变量(
days
msg
)都将是全局变量,并且会污染全局名称空间。

从技术上讲,这是正确的(因为函数是立即调用的,所以没有作用域好处;普通的无聊函数也会这样做),但不要忘记这一点

  • 您现在有一些代码要运行
  • 您不希望该代码将名称泄漏到当前作用域中

  • 因此,函数是因为#2而创建的,但它也是因为#1而立即调用的。

    它不是关于立即执行的函数与常规函数的比较;事实上,它几乎没有什么关系

    立即调用的包装函数的唯一目的是作用于包装函数的局部变量

    (function() {
        // This variable is only available within this function's scope
        var thisIsTemp = "a";
    
        // ...
    }());
    
    console.log(thisIsTemp); // undefined        
    
    vs:


    var
    在函数内部的思想是

    不向全局范围泄漏任何变量

    在这种情况下,天在函数外部是不可见的,如果您尝试在控制台
    console.log(days)
    中写入,您将得到未定义的天


    之所以这样做,是因为您永远不知道以后还会有谁在使用您的代码,而且他可能会重新定义您的可变天数。

    days
    仍在函数的本地范围内。这里要做的是在本地范围内执行任务,以便在该范围内定义的任何内容都不会污染全局命名空间。否则,您将在全局范围内具有以下内容:

    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
    
    // ...
    { 
        var days = ['Sun','Mon'];
        // ...
        // ...
    }
    alert(msg);
    

    在JavaScript中,局部变量具有函数作用域,而不是块作用域。例如,在您发布的代码中,
    days
    实际上是函数的本地部分:

    (function() {
      var days = ['Sun','Mon'];
      // ...
      // ...
      alert(msg);
    }());
    
    但如果你在全球范围内说:

    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
    
    // ...
    { 
        var days = ['Sun','Mon'];
        // ...
        // ...
    }
    alert(msg);
    
    days
    将成为一个全局变量(外部范围内的所有对象都可见),即使它是在块内定义的。这有意义吗

    “您需要一个立即函数将所有代码包装在其局部作用域中,而不将任何变量泄漏到全局作用域”

    事实并非如此。(或者至少是有争议的)

    我认为OP所问的是,“你需要一个立即函数来创建局部作用域,还是只使用普通的函数作用域?”我同意OP的观点,即函数和立即函数将把变量
    days
    隐藏在它自己的作用域中。要测试变量是否为全局变量,(在控制台中),您可以检查它是否在
    窗口中定义

    即时功能: 正常功能: 如您所见,
    days
    在这两种情况下都不是全局的。它在功能范围内是隐藏的或私有的。但是,在第二个示例中,我确实创建了一个全局的
    func
    。但这证明了您不需要立即函数来创建局部作用域


    附言:我从未读过这本书。我相信作者是聪明的,知道他们在说什么,但在这个确切的案例中不够具体。或者,我们需要更多的上下文来完全理解报价。

    我也有同样的问题
    我认为立即函数的唯一好处是它应该与匿名函数一起使用
    当我们使用匿名函数时,这意味着它永远不会被重用;没有名字你怎么能调用它?
    因此,将其作为一种即时功能变得更好。
    作者没有说清楚

    var func = function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
    func();
    

    天数也在func的局部范围内,而不是全局变量

    ,并且您不会看到外部变量,如果它不在上面的闭包内,它将是全局变量。(范围将是窗口,即,与在没有
    var
    的情况下声明它相同)不确定我是否得到了您的要求…不,正如您所说的
    days
    将在函数范围内,而不是全局范围内。这就是范围优势。我知道你对他的评论的理解是错误的。这并不是说你的代码有很多优点(虽然有,但这不是重点)。主要原因是,同一站点上的其他Javascript将有一个额外的保护层,以防止您犯下的任何错误。什么?如果在函数中使用
    var
    定义
    days
    将如何在全局范围内?请尝试重新阅读我的答案。如果没有立即调用的函数,变量将是全局的。@lanzz Uggh,对不起,我读得太快了。我错了!我以为您是在暗示,如果没有立即调用,函数中的所有内容都将在全局范围内。阅读理解失败。我认为这是最好的答案。它不是直接封闭函数与普通封闭函数的比较。它是直接函数,而不是完全没有封闭函数。只是普通的JavaScript。
    var func = function() {
    var days = ['Sun','Mon'];
    // ...
    // ...
    alert(msg);
    func();