为什么在Javascript模块模式中使用自执行匿名函数?

Bre*_*dan 9 javascript closures module

在JavaScript中的模块模式中,"立即调用函数表达式"(也称为自执行匿名函数)用作返回对象的自执行函数.自执行函数如何隐藏私有变量并仅显示返回的对象.为什么普通的JavaScript函数不会发生这种情况?那么在下面的迷你模块中,为什么我们不能在没有enclosing()()的情况下实现相同的封装概念?

var Module = (function () {
    var privateVariable = "foo",
        privateMethod = function () {
            alert('private method');
        };

    return {
        PublicMethod: function () {
            alert(privateVariable); 
            privateMethod(); 
        }
    };
})();
Run Code Online (Sandbox Code Playgroud)

Mik*_*uel 9

自执行函数如何隐藏私有变量并仅显示返回的对象.为什么普通的JavaScript函数不会发生这种情况?

它确实发生在普通的JavaScript函数中.

function MakeModule() {
    var privateVariable = "foo",
        privateMethod = function () {
            alert('private method');
        };

    return {
        PublicMethod: function () {
            alert(privateVariable); 
            privateMethod(); 
        }
    };
}

var Module = MakeModule();
Run Code Online (Sandbox Code Playgroud)

会工作得很好.

唯一的区别是匿名函数引入了一个较少的全局变量,并且允许自己被垃圾收集,而MakeModule除非delete作者明确指出,否则无法收集.