Прежде всего, пожалуйста, не такой синтаксис:
var mystuff=function(){...}();
Это плохая практика кодирования, поскольку он не является полностью кросс-браузер, как несколько браузеров будет ошибка здесь. Привыкайте положить круглые скобки вокруг функции следующим образом: \
var mystuff=(function(){...})();
Nextly, относительно структуры. Этот шаблон более известен как просто «инкапсуляция» в JavaScript. Закрытие - это, возможно, другое, но более конкретно это чисто инкапсуляция в этом случае.
Инкапсуляция просто означает, что вы делаете некоторые члены закрытыми. Что является приватным в этом случае? Ну, переменная blah является приватной в этом случае. Пожалуйста, приучитесь к тому, чтобы приступить к участию в частных лицах, подчеркнув, что они являются частными. Хорошая практика кодирования отличает общедоступные методы от частных методов с подчеркиванием.
<script type="text/javascript">
var obj=(function(){
//private members
var _p={};//toss all private members into a single object.
_p.list=[];
_p.init=function(){
_p.list=[];
};
//public members. use "this" to reference object followed by the method.
//however obj._p.list won't be accessible to the global scope
return {
reset:function()
{
_p.init();
}
,addName:function(str)
{
_p.list.push(''+str);//limit to strings
}
,getNames:function()
{
return _p.list.slice(0);//return a clone
}
,alertNames:function()
{
alert(this.getNames().join(","));
}
,getPrivateObj:function()
{
return _p;
}
};
})();
obj.alertNames();
obj.addName("Nandan");
obj.addName("Ram");
obj.alertNames();
obj.reset();
obj.alertNames();
obj.addName("Vinoth");
obj.addName("Kevin");
obj.alertNames();
alert(typeof obj._p);//undefined
var privateObj=obj.getPrivateObj();
alert(typeof privateObj);
alert(privateObj.list.join("|"));
</script>
Причина проголосова? – Noldorin