2013-05-03 28 views
9

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

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

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

让您的头脑围绕什么是分配应该给你必要的了解50%。另外50%来自对[关闭]的理解(https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures)。如果您仍然遇到麻烦,请阅读Douglas Crockford的“[JavaScript中的私人成员](http://javascript.crockford.com/private.html)”。 – 2013-05-05 14:29:37

回答

9

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

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

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

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

var Module = MakeModule(); 

会工作得很好。

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

+0

如果IIFE形成一个包含所返回内容的引用的闭包,IIFE是否真的可以被GC'd? – 2013-05-03 22:56:39

+1

@DaggNabbit,是的。只要它的'arguments'对象没有被使用。函数对象是作为调用的操作数创建的,因此只要调用完成,就不再使用它的初始引用,并且调用剩下的唯一东西就是任何执行上下文,通过转义内部函数关闭存储变量。 – 2013-05-04 00:55:01

2

私密性是因为关闭。 “var privateVariable”由“PublicMethod”关闭,所以只有该函数可以访问该变量,因为只有它在关闭时才有。它不能被任何其他引用,并且是“私有的”

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

也看到这个帖子从道格拉斯Crockford的自己:http://javascript.crockford.com/private.html

+0

“立即创建封闭”的想法最好地回答我的问题。 – Brendan 2013-05-05 20:31:31

0

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

例子:

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