【问题标题】:Why are self-executing anonymous functions used in Javascript Module pattern?为什么在 Javascript 模块模式中使用自执行匿名函数?
【发布时间】:2013-05-03 22:42:43
【问题描述】:

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

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

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

【问题讨论】:

  • 把注意力集中在分配的内容上应该会给你 50% 的必要理解。另外50%来自对closures的理解。如果您仍有问题,请阅读 Douglas Crockford 的“Private Members in JavaScript”。

标签: javascript module closures


【解决方案1】:

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

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

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

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

var Module = MakeModule();

会很好用。

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

【讨论】:

  • 如果 IIFE 形成一个包含被它返回的任何东西引用的东西的闭包,它真的可以被 GC 吗?
  • @DaggNabbit,是的。只要不使用其arguments 对象。函数对象被创建为调用的操作数,因此一旦调用完成,对它的初始引用就不再使用,调用中唯一剩下的就是存储通过转义内部函数关闭的变量的任何执行上下文.
【解决方案2】:

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

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

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

【讨论】:

  • 我认为“立即创建闭包”的想法最能回答我的问题。
【解决方案3】:

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

例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多