【问题标题】:Immediate functions JavaScript立即函数 JavaScript
【发布时间】:2023-03-24 01:50:02
【问题描述】:

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

这是他的例子

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

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

【问题讨论】:

  • 你不会从外面看到这些变量
  • 如果它不在上面的闭包内,它将是一个全局变量。 (范围将是窗口,即与在没有var 的情况下声明它相同)不确定我明白您的要求...
  • 不,正如您所说,days 将在函数范围内,而不是全局范围内。 这就是范围优势。
  • 恕我直言,您以错误的方式解释了他的评论。您的代码没有太多优势(尽管有,但这不是重点)。主要原因是同一站点上的其他 Javascript 将有额外的保护层,以防止您可能犯的任何错误。

标签: javascript function iife


【解决方案1】:

这不是关于立即执行的函数与常规函数的区别。事实上,它几乎没有任何关系。

立即调用的包装函数的唯一目的是限定包装函数的局部变量。

(function() {
    // This variable is only available within this function's scope
    var thisIsTemp = "a";

    // ...
}());

console.log(thisIsTemp); // undefined        

对比:

// This variable is available globally
var thisIsTemp = "a";

// ...

console.log(thisIsTemp); // "a"

【讨论】:

  • 我认为这是最好的答案。它不是立即封闭函数与普通封闭函数的情况。它是直接功能而不是完全没有封闭功能。只是普通的 JavaScript。
【解决方案2】:

在函数范围内拥有days 变量正是该示例的重点。如果没有立即调用的函数,所有变量(daysmsg)都是全局变量,会污染全局命名空间。

【讨论】:

  • 什么?如果在函数内部使用var 定义days,它将如何在全局范围内?
  • 尝试重新阅读我的答案。 没有立即调用的函数,变量将是全局的。
  • @lanzz Uggh,抱歉我读得太快了。我的错!我以为您是在暗示,如果没有立即调用,函数内的所有内容都将在全局范围内。阅读理解失败。
【解决方案3】:

从技术上讲这是正确的(没有作用域优势,因为该函数是即时的;一个普通的无聊函数也可以做到这一点),但不要忘记这一点

  1. 您有一些代码要立即运行
  2. 您不希望该代码将名称泄漏到当前范围内

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

【讨论】:

    【解决方案4】:

    “您需要一个立即函数将所有代码包装在其本地范围内,而不会将任何变量泄漏到全局范围内”

    这不是真的。 (或者至少是值得商榷的)

    我认为 OP 的要求是,“您需要一个立即函数来创建本地范围还是只使用普通函数范围?”我同意 OP 的观点,即一个函数和一个立即函数会将变量 days 隐藏在它自己的范围内。要测试变量是否是全局变量,(在控制台中)您可以检查它是否在 window 上定义。

    立即函数:

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

    普通函数:

    var func = function() {
        var days = ['Sun','Mon'];
        // ...
        // ...
        alert(msg);
    };
    window.days; // undefined
    Object.prototype.toString.call(window.func); // "[object Function]"
    

    如您所见,days 在这两种情况下都不是全局变量。它在函数范围内是隐藏的或私有的。但是,我确实在第二个示例中创建了一个全局 func。但这证明您不需要立即函数来创建本地范围。

    PS:我从来没有读过这本书。我敢肯定作者很聪明,知道他们在说什么,但在这种情况下还不够具体。或者,也许我们需要更多关于引用的上下文来完全理解它。

    【讨论】:

      【解决方案5】:

      var 在函数内部的想法是

      不要将任何变量泄漏到全局范围

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

          但是,如果您要在全球范围内说以下内容:

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

          days 将成为全局变量(外部范围内的所有内容都可见),即使它是在块内定义的。这有意义吗?

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2012-06-14
              • 1970-01-01
              • 2021-08-17
              • 2013-10-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-20
              • 2017-05-20
              相关资源
              最近更新 更多