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

时间:2013-05-03 22:42:43

标签: javascript module closures

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

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

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

3 个答案:

答案 0 :(得分:9)

  

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

普通的JavaScript函数确实会发生这种情况。

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

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

var Module = MakeModule();

会工作得很好。

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

答案 1 :(得分:2)

私密性是因为封闭。 “var privateVariable”由“PublicMethod”关闭,因此只有该函数才能访问变量,因为只有它在闭包中才有。它不能被其他任何东西引用,而且是“私人的”

这不仅发生在“立即调用函数表达式”中,而且发生在正常函数调用中。它只是在定义模块时立即创建闭包的一种方法,而不是在您调用外部函数时稍后执行它。

另见Douglas Crockford本人的帖子:http://javascript.crockford.com/private.html

答案 2 :(得分:0)

您可以通过命名函数定义匿名函数。

示例:

//factorial
(function(n){
    var self = function(n){
        //call self
        return n > 0 ? (self(n-1) * n) : 1;
    }
    return self;
})()