4

有人可以解释一下这两个功能有什么区别吗?

(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

4 回答 4

7

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

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

于 2013-08-15T15:16:30.250 回答
2

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

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

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

Engine.Login = function(){}

这将在全球范围内可用。

功能登录仅在匿名自执行功能的范围内可用。

于 2013-08-15T15:17:08.180 回答
2

函数本身并没有真正的区别。唯一的区别是第一个函数被分配给在全局范围 ( Engine.init) 中定义的对象 ()的属性,而第二个函数是在立即调用的函数表达式(IIFE)中本地定义的。window.Engine

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

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

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

foo();

因为第一个函数被显式分配给全局变量,所以可以在foo, afterfoo执行后访问它。localFunc没有导出,因此是本地的foo,即它不能被访问并且不存在于foo.

于 2013-08-15T15:17:58.353 回答
0

这东西

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

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

Engine.Init = ...

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

于 2013-08-15T15:20:55.230 回答