2011-11-08 14 views
2

私はグローバル変数を使わないように言われました。グローバル変数を避けるには?

私は、クライアント側の検証をオフ/オンに使用します。

私はさらに2つのドロップダウンメニューを使用しています。

これらは私がそれらを置くべきである場合は、グローバル変数ではないはずですか?ここでは、グローバル */

var client_validation=1, // used to turn off/on client-side validation 
    menu_timer=0, 
    menu_elment=0; 
window.onload=i0; 

/*menu*/ 

function top_mouse_over(id) 
    { 
    bottom_mouse_over(); 
    if(menu_element)menu_element.style.visibility='hidden'; 
    menu_element=document.getElementById(id); 
    menu_element.style.visibility='visible'; 
    } 
function internal_time() 
    { 
    if(menu_element)menu_element.style.visibility='hidden'; 
    } 
function mouse_out() 
    { 
    menu_timer=window.setTimeout(internal_time, 500); 
    } 
function bottom_mouse_over() 
    { 
    if(menu_timer) 
    { 
    window.clearTimeout(menu_timer); 
    menu_timer=0; 
    } 
    } 



Header 1 // This makes more sense 
    Content 

Header 1 // Than this 
Content 
+1

関連のないコメントでは、インデントスタイルを一貫して使用していますが、Gnuスタイルよりも読みにくくなっています。これは、インデントするJS-yスタイルではありません。 – kay

+1

IMOは、中括弧自体と同じレベルの中括弧の中にコードを置くことが読みにくい主な理由です。 –

+0

'window.onload = i0;'はあなたがそれを持っていたようにうまくいきました。その答えのように 'globalControls'の' window_onload'プロパティに変更しないでください。 – nnnnnn

答えて

2

それはそれらがグローバルの良い候補であるかもしれないあなたのように私に聞こえます。グローバルは、複数の部分にまたがる基本的な振る舞いを制御するような、アプリケーションの広範な影響を伴う操作のために予約されているはずです。あなたが彼らのために、「名前空間」を作成したい場合は

さて、それはこの単純です:

var globalControls = { 
    client_validation:1, 
    menu_timer:0, 
    menu_elment:0, 
    window_onload:i0 
}; 

Javascriptがまだ本当の名前空間を持っていません。 ECMAScriptの次のバージョンがその機能を追加するまで、オブジェクトはそれらの代替物として使用されます。

+0

menu_element:0;それの後にコンマを置く必要がありますか? –

+0

はい、カンマで、それはちょうどタイプミス(固定)でした。 @Mike - なぜあなたのオブジェクトの 'window_onload'プロパティに' window.onload = i0; '文を質問から変更しますか? – nnnnnn

+0

別の設定フラグのようにするために、window_onloadに変更しました。それ以外の本当の目的はありません。 –

0

タイトルは「グローバル変数を避けるにはどうすればよいですか」です。しかし、それは大丈夫です。

オブジェクトを作成してプロパティを割り当てることができます。次に、オブジェクト内に変数があり、これらの変数はグローバルスコープではなく、この変数を介してのみアクセスできます。

例:

var config = { 
    clientValidation: true, 
    menuTimer: 0, 
    menuElement: 0, 
    someFunction: function() { 
     // alert (this.clientValidation) "this" is the object scope 
    } 
}; 
// then you access the object properties: 
alert(config.clientValidation); // true 
0

名前空間が衝突からクラス定義を分離し、しかし、それはグローバル変数の問題を解決することはできません。これは一時的な修正です。

グローバル変数の解決策は、さもなければグローバルになるプロパティをカプセル化するクラスインスタンスを使用することです。カプセル化は、オブジェクト指向プログラミングの3つの柱の1つです。

カプセル化されたプロパティを持つ名前空間を持つクラスの例を参照してください。 さらに、クラスを使用するカスタムjqueryプラグインを作成する方法を示します。 http://www.robusthaven.com/blog/javascript-development/Automatically-generate-the-table-of-contents-with-jQuery

私は必要なデータを持っているが、通常、私が代わりにこのデータを利用してDOM要素をオブジェクト形式でデータを添付するhttp://api.jquery.com/jQuery.data/を使用するグローバル変数を作成する必要となる持続しました。

関連する問題