私有与公共Javascript函数

时间:2013-08-15 15:14:55

标签: javascript

有人可以解释这两个功能之间的区别吗?

(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()可用ConsoleLogin不可用。

4 个答案:

答案 0 :(得分:7)

Init是引用函数的Engine对象的属性 您可以像任何其他财产一样访问它。

Login是匿名中的局部变量,“立即调用的函数表达式”(IIFE);与其他局部变量一样,其名称仅在声明函数

中可见

答案 1 :(得分:2)

引擎是全局因为参数:

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

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

Engine.Login = function(){}

这将在全球范围内提供。

函数Login仅在匿名自执行功能的范围内可用。

答案 2 :(得分:2)

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

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

function foo() {
    // 1
    window.globalFunc = function() {
        // global/public
    }

    // 2
    function localFunc() {
        // local/private
    }
}

foo();

因为第一个函数是显式分配给全局变量,所以在执行foo之后,可以在foo之外访问它。 localFunc未导出,因此无法导出foo,即foo之外无法访问{<1}}。

答案 3 :(得分:0)

这件事

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

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

Engine.Init = ...

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