模块模式中的这个关键字?

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并且它们被定义thatthis.因此,他们基本上将所有内容转储到全局对象中,并且所有子模块名称实际上都是别名window.有没有理由有人想要这样做?或者这对我来说真的是错误的吗?

编辑:

我在放置var子模块定义之前犯了一个错误,最初我写的东西略有不同,忘记删除了var.我试图让这个例子更加清晰,希望现在我的意思更明显.

编辑2:

此外,我已经看过在Firebug中执行的脚本,他们肯定是在添加所有东西window,这个对象是一团糟.

gdo*_*ica 3

是的,看起来不对。

\n\n
MODULENAME = 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}());\n
Run Code Online (Sandbox Code Playgroud)\n\n

其可能造成的伤害演示:

\n\n
var 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!\n
Run Code Online (Sandbox Code Playgroud)\n

  • @马克林纳斯。他们想要污染全局物体?!我相信他们不会。**无论如何,如果你想做错事并且你做了错事 - 它仍然是错的......** :) (2认同)