【问题标题】:Private vs Public Javascript Functions私有与公共 Javascript 函数
【发布时间】:2013-08-15 23:45:26
【问题描述】:

谁能解释一下这两个函数有什么区别?

(function(Engine, $, undefined) { //hidden from scope
    //public function below
    Engine.Init = function() {
        console.log("IM PUBLIC");
    }

    //anonymous functions below
    function Login() {
        console.log("IM PRIVATE");
    }
})( window.Engine = window.Engine || {}, jQuery );

具体来说,我想知道为什么Engine.Init()Console 中可用,而Login 不可用。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    InitEngine 对象的一个​​属性,它引用一个函数。
    您可以像访问任何其他属性一样访问它。

    Login 是匿名“立即调用函数表达式”(IIFE) 中的局部变量;和其他局部变量一样,它的名字只在声明函数中可见

    【讨论】:

    • 我想在这里问你一个问题,虽然它可能与这个问题无关:(function(){}) 与 function(){} 之间有什么区别?这有什么要处理的匿名函数或作用域或它是什么?
    • 这只是一个句法修饰,以确保函数定义可以立即调用。请参阅“旁白:函数、括号和语法错误”下的 benalman.com/news/2010/11/…
    • @lmjohns3:您为我指出了绝对正确的方向。感谢您的链接。
    • 可爱的解释和更好的链接!伙计们干杯!
    【解决方案2】:

    由于参数,引擎是全局的:

    (window.Engine = window.Engine || {}, jQuery)
    

    并且在全局命名空间中可用,如果你这样做了:

    Engine.Login = function(){}
    

    这将在全球范围内可用。

    函数登录只在匿名自执行函数的范围内可用。

    【讨论】:

      【解决方案3】:

      函数本身并没有真正的区别。唯一的区别是第一个函数被分配给在 global 范围 (window.Engine) 中定义的对象 (Engine.init) 的属性,而第二个函数是在 本地immediately invoked function expression (IIFE) 内。

      这是一个等效但更简单的例子:

      function foo() {
          // 1
          window.globalFunc = function() {
              // global/public
          }
      
          // 2
          function localFunc() {
              // local/private
          }
      }
      
      foo();
      

      因为第一个函数是显式分配给一个全局变量的,所以它可以在foo 之外被访问,在foo 被执行之后。 localFunc 未导出,因此是 foo 的本地对象,即它无法访问,并且在 foo 之外不存在。

      【讨论】:

        【解决方案4】:

        这东西

        function(Engine, $, undefined) {
        ...
        }
        

        实际上是一个闭包。因此,该函数内定义的所有内容仅在该范围内可用。当你这样做

        Engine.Init = ...
        

        您创建一个附加到 Engine 对象的属性。在您的情况下,引擎是一个全局对象,这意味着您可以通过控制台访问它。

        【讨论】:

        • “因此,在该函数内定义的所有内容仅在该范围内可用。” 这与闭包无关,这就是 每个 函数的工作方式.虽然从技术上讲,每个函数在 JS 中都是一个闭包,但这里的问题与闭包无关。
        • 嗯 ... JavaScript 中的每个函数(就像其他所有东西一样)都是一个对象。我们可以说对象的属性是公共变量。如果你在函数中添加“var something = ...”,那么这个东西是一个私有变量,仅适用于闭包的范围。这不是真的吗?
        • 你可以这么说,但函数是否是闭包并不重要。
        猜你喜欢
        • 2012-10-25
        • 2012-05-29
        • 2015-04-02
        • 2017-02-05
        • 2016-12-03
        • 2017-04-30
        • 2011-12-03
        • 1970-01-01
        • 2011-06-18
        相关资源
        最近更新 更多