2012-01-17 14 views
60

関数をオブジェクトに定義するのではなく(したがってグローバルに)関数を関数に格納するのは、コーディング慣行が悪いと考えられますか?Javascript - オブジェクトに関数を格納する - 悪い練習ですか?

は考えてみましょう:

1.

Foo = { 
    bar: function() { 
     alert("baz"); 
    } 
} 

Foo.bar();

2.

function bar() { 
    alert("baz"); 
} 

bar();

確かに、2番目の例ではコードが少し少なくなるかもしれませんが、たくさんの機能を使い始めると、面倒です。 updateGame()を使用する代わりに、たとえば、Game.update()を使用すると、それはやり方ではありません。または類似。 Game.notify.admin(id)などのように深くなると、さらにきれいなコードが得られます。

オブジェクトに関数を格納しても何か不利な点はありますか?

+2

いいえ、それがあった場合、世界中の何百万人ものユーザーがいるフレームワークはそれをしません。 – Jon

+2

いいえあなたの質問が既に指摘されているように、これは地球規模の汚染を避けるための標準的な名前空間です。なぜそれが悪いのだろうか? –

答えて

56

第1のアプローチが好ましい。このようにして、グローバルスコープを汚染するのではなく、関数のスコープを明示的に定義しています。第1のアプローチを使用することの弱点はありません。上向きのみ:-)

結論:常に関数を定義するための最初のアプローチを使用してください。 2つ目は90年代のjavascriptのようなものです。過去に安心して安静にしておき、適切なスコープを使用しましょう。

+1

積極的に入れ子にすることにはいくつかの欠点があります。 _functions_を "それが良いので"オブジェクトに置くことは、例えば愚かです。 (グローバルスコープに関数を置くことも愚かですが、これはモジュールのスコープを想定したものではありません)。4つのレイヤーを越えてオブジェクトや機能をネストすると、愚かなことになります。理想的には、あなたのオブジェクト/メソッドチェーンのための1つか2つのレイヤーが必要です。 'foo.bar.baz()' – Raynos

+2

本当に範囲についてですか?あるいは、重複した変数名の可能性を減らすためにグローバル変数の数を減らすことです。 「地球規模の汚染」には**その他の有害な副作用がありますか? @RobGのメンテナンス性。 – RobG

+0

大域変数の数をゼロに減らそうとする十分な理由がたくさんあります。 – Raynos

3

この特定のケースでは、最初のものと一緒に行ってください。しかし、Fooオブジェクトが本当に複雑になった場合は、コンストラクタを使用する別の方法を使用することもできます。そこの名前空間オブジェクトと魔法ではありません、でもあなたはグローバル変数の多くを使用する場合は、必ずしもすべての問題を持っています

function Foo(appName){ 
    this.name = appName;  
} 

Foo.prototype.Bar = function(){ 
    alert(this.name) 
} 

var a = new Foo("baz"); 
a.Bar(); 
+0

アンチパターンが検出されました。プロトタイプを使用してください、ありがとうございます。 – Raynos

+0

あなたの右@Raynos、関数の中で関数を宣言する際の問題は、クラスを開始するたびに再作成されることです。 –

4

:それは、関数のスコープに来るときも最初のアプローチは、時々、最高ではありません。 "名前空間"オブジェクトを使用する主な理由は、重複するグローバル変数名の可能性を減らすためです。第二の理由は、例えば、利便性のために一緒にグループ同様の機能にある。もちろん

// Global variable example: 
myLib_dom_someDOMFunction0; 
myLib_dom_someDOMFunction1; 

myLib_util_someUtilityFunction0; 
myLib_util_someUtilityFunction1; 

前者が一般的である:上記は実質的に同様にグローバル変数として重複の同じ機会たこと

// Object example (suggested best practice): 
// DOM functions are under myLib.dom 
myLib.dom.someDOMFunction0; 
myLib.dom.someDOMFunction1; 

// Utility functions are under myLib.util 
myLib.util.someUtilityFunction0; 
myLib.util.someUtilityFunction1; 

は注意それは作業が容易であると考えられたので好ましい。私は、グローバル変数をたくさん作成することに問題があるが、いわゆる「グローバル・ネームスペース汚染」がハザードとして大きく誇張されていることを指摘して、第2のアプローチを採用することを主張しているわけではない。

関連する問題