在JavaScript中的模块模式中,“Immediately-Invoked Function Expressions”(也称为自执行匿名函数)用作返回对象的自执行函数。 自执行函数如何隐藏私有变量并仅显示返回的对象。为什么普通的JavaScript函数不会发生这种情况? 那么在下面的迷你模块中,为什么我们不能在没有封闭()()的情况下实现相同的封装概念?
var Module = (function () {
var privateVariable = "foo",
privateMethod = function () {
alert('private method');
};
return {
PublicMethod: function () {
alert(privateVariable);
privateMethod();
}
};
})();
答案 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;
})()