9

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

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

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

3 回答 3

9

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

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

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

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

var Module = MakeModule();

会工作得很好。

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

于 2013-05-03T22:45:03.767 回答
2

隐私是因为闭包。“var privateVariable”由“PublicMethod”封闭,因此只有该函数可以访问该变量,因为只有它在其闭包中拥有它。它不能被其他任何东西引用并且是“私有的”

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

另请参阅 Douglas Crockford 本人的这篇文章:http: //javascript.crockford.com/private.html

于 2013-05-03T22:46:00.577 回答
0

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

例子:

//factorial
(function(n){
    var self = function(n){
        //call self
        return n > 0 ? (self(n-1) * n) : 1;
    }
    return self;
})()
于 2015-01-06T19:37:07.293 回答