2012-05-09 6 views
4

私は新しい会社で仕事を始めたばかりで、多くのJSで私に間違っているように見えるものに気付きました。私はかなり後輩であるので、これが間違っていることを確認することなくそれを引き出すのはちょっと躊躇しています。私はJSの専門家ではなく、2日目です。私は馬鹿に見えたくありません。このキーワードはモジュールパターンにありますか?

MODULENAME = MODULENAME || {}; 

MODULENAME.SUBMODULENAME = (function() { 
    var bla = {}; 

    bla.somefunction = function() { 
     //do stuff 
    }; 

    //add more stuff to bla 
    return bla; 
}()); 

彼らはすべて彼らのコードの上に持っていることである:

MODULENAME = MODULENAME || {}; 

MODULENAME.SUBMODULENAME = (function() { 
    var that = this; 

    that.somefunction = function() { 
     //do stuff 
    }; 

    //add more stuff to that 
    return that; 
}()); 

今のコース機能ISNので」

ので、通常私は、モジュールのパターンのようなものを見て期待しますnewキーワードを持つコンストラクタ、または方法としてthisが呼び出され、windowにバインドされ、thatthisと定義されています。だから、彼らは基本的にすべてをグローバルオブジェクトにダンプしていて、すべてのサブモジュール名は実際にwindowのエイリアスです。誰かがこれをやりたがっている理由はありますか?それとも、これは本当に間違っているようですか?

編集:

私はもともと、私は少し別の何かを書き、varを削除するのを忘れて、サブモジュールの定義の前にvarを置くことでミスを犯しました。私はこの例をもう少し明確にするように努力しました、うまくいけば、私が今何を意味するのかがもっと分かります。

編集2:

また、私はFirebugの中で実行されるスクリプトを見てきましたし、彼らは間違いなくwindowにすべてを追加すると、そのオブジェクトは合計混乱です。

+0

申し訳ありませんが、あなたの質問を理解できませんでした。それをより良く説明できますか? –

+0

'this'はクラスや要素を参照していませんか?私もあなたの質問を理解しているか分からない。 –

+6

あなたは新しい会社に着手したばかりで、わからないことがわかりました。コードを知っている同僚にあなたがそれについて投稿した理由は何かを尋ねるのではなく、新しい仕事を始めるには悪い方法のようだ。 –

答えて

3

はい間違っています。

var x = function() { 
    alert('out'); 
} 
var MODULENAME = MODULENAME || {}; 

MODULENAME.SUBMODULENAME = (function() { 
    var that = this; 
    that.x = function() { 
     alert('DAMAGE'); 
    } 
}()); 

x();​ // alert DAMAGE and not "out" - messed up with the global object! 
+0

私はそれが間違っているとは思わない。私はそれが彼が望んだと思います –

+2

@ MarkLinus。彼らは地球規模のオブジェクトを汚染したいですか?私は彼らがしないと信じています。 **何か間違ったことをして、あなたが何か間違っていたら - それは間違っています... ** :) – gdoron

+0

グローバルを宣言することは良い習慣ですが、ここで違いはありません。 @ RobG。 – RobG

0

モジュールのパターンが誤って使用され、そしてそれらの使用は、関数宣言の上に何を提供していないところ関数式を使用すべきでない理由のひとつ:

MODULENAME = MODULENAME || {}; // missing var 

var MODULENAME.SUBMODULENAME = (function() { // probably the missing var from above... 
    var that = this; 
    //add some stuff to that 
    return that; // that is the WINDOW- wrong. 
}()); 

DEMO損傷のためにそれを行うことができます。意図は(私はそれは疑う)グローバル関数を作成することであるならば、それらは使用する必要があります。

function somefuncion() { 
    ... 
} 

を自分の意思がより可能性が高い場合であるオブジェクトに(この場合の方法で)プロパティを追加している場合次に、

MODULENAME.SUBMODULENAME.somemethod = function() { /* do stuff */ }; 

条件付きでメソッドを作成する必要がある場合特徴検出に基づいて、次の月のスーツ:上記と

(function(global, undefined) { 

    // In here global is the global object 
    global.MODULENAME = global.MODULENAME || {}; 
    global.MODULENAME.SUBMODULENAME = global.MODULENAME.SUBMODULENAME || {}; 

    // and undefined is undefined, belt and braces approach 
    undefined = void 0; 

    // Direct assignment 
    function somemethod() { 
     //do stuff  
    }; 

    // Assign directly to the "namespace" object 
    MODULENAME.SUBMODULENAME.somemethod = somemethod; 

    // Conditional assignment 
    if (sometest) { 
    MODULENAME.SUBMODULENAME.anothermethod = function(){...}; 

    // Try another way... 
    } else if (someOtherTest) { 
    MODULENAME.SUBMODULENAME.anothermethod = function(){...}; 

    // Default 
    } else { 
    MODULENAME.SUBMODULENAME.anothermethod = function(){...}; 
    } 

    // Clean up 
    global = null; 

}(this)); 

1つの問題は、外側の関数内で宣言されているすべての機能がバック関数オブジェクトとその環境への閉鎖を持っているということなので、それは少し無駄ですリソース。単純なままにして、本当に必要な場所にモジュールパターンを使用し、単純な関数宣言や割り当てを使用するだけで、はるかに効率的です。ファンキーではなく実用的です。

関連する問題