我已经开始在我的一个项目中使用模块模式。据我了解,它是这样的:
var obj = (function(foo){
//Some initialization logic up here.
//Private methods
var privateBazz = function(){
return "I'm known only to this closure!";
}();
//Public methods
return {
publicFoo: foo,
publicBar: function(){
return foo + privateBazz;
}
}
})();
这在纸上看起来相当不错,在实践中,似乎工作得相当好。顶部的初始化逻辑是直观的,然后是私有方法,然后是公共方法。
不过,我遇到了一个问题。我应该如何从 return 语句的范围之外和 obj 的函数声明范围内调用 publicFoo 或 publicBar?
我目前的解决方案是执行以下操作:
var obj = (function(foo){
//Private methods declared early for use.
var privateBazz = function(){
return "I'm known only to this closure!";
}();
var privateBar = function(){
return foo + privateBazz;
};
//Some initialization logic up here.
var dependentOnBar = privateBar();
//Public methods
return {
publicFoo: foo,
publicBar: privateBar
}
})();
这行得通,但是突然间我的私有变量的声明被放置在我的对象私有属性声明之上。如果我试图让私有函数声明与第一次调用它们的代码一样接近,问题会变得更加严重,所以我只是在顶部声明了我需要的所有私有函数,然后再初始化属性。同样,这可行,但我习惯于让代码尽可能靠近执行点。所以,在顶部声明私有函数块对我来说真的很尴尬。有没有其他人有这种感觉,或者这是我只需要克服 JavaScript 的问题吗?当我看到这种情况发生时,我应该采取什么步骤吗?