Mic*_*hal 5 javascript design-patterns global-object
我刚刚开始在一家新公司工作,并注意到在他们的很多JS中我看起来完全没错.我有点犹豫要提起它而不确认这是错的,因为我很小,我不是JS专家,这只是我的第二天,我不想看起来很愚蠢.
所以,通常我希望模块模式看起来像:
MODULENAME = MODULENAME || {};
MODULENAME.SUBMODULENAME = (function() {
var bla = {};
bla.somefunction = function() {
//do stuff
};
//add more stuff to bla
return bla;
}());
Run Code Online (Sandbox Code Playgroud)
他们的代码是:
MODULENAME = MODULENAME || {};
MODULENAME.SUBMODULENAME = (function() {
var that = this;
that.somefunction = function() {
//do stuff
};
//add more stuff to that
return that;
}());
Run Code Online (Sandbox Code Playgroud)
现在当然因为函数没有作为带有new关键字或方法的构造函数被调用,所以它this被绑定window并且它们被定义that为this.因此,他们基本上将所有内容转储到全局对象中,并且所有子模块名称实际上都是别名window.有没有理由有人想要这样做?或者这对我来说真的是错误的吗?
编辑:
我在放置var子模块定义之前犯了一个错误,最初我写的东西略有不同,忘记删除了var.我试图让这个例子更加清晰,希望现在我的意思更明显.
编辑2:
此外,我已经看过在Firebug中执行的脚本,他们肯定是在添加所有东西window,这个对象是一团糟.
是的,看起来不对。
\n\nMODULENAME = MODULENAME || {}; // missing var\n\nvar MODULENAME.SUBMODULENAME = (function() { // probably the missing var from above...\n var that = this;\n //add some stuff to that\n return that; // that is the WINDOW- wrong.\n}());\nRun Code Online (Sandbox Code Playgroud)\n\n其可能造成的伤害演示:
\n\nvar x = function() {\n alert(\'out\');\n}\nvar MODULENAME = MODULENAME || {};\n\nMODULENAME.SUBMODULENAME = (function() {\n var that = this;\n that.x = function() {\n alert(\'DAMAGE\');\n }\n}());\n\nx();\xe2\x80\x8b // alert DAMAGE and not "out" - messed up with the global object!\nRun Code Online (Sandbox Code Playgroud)\n