2012-05-09 3 views
29

私はJavaScriptでグローバル変数を使用しないように警告していますが、グローバル名前空間を詰まらせる理由があるというだけの理由があるようです。すべての変数を1つの大きなオブジェクトに入れることで、これを簡単に修正できると思います。ここで問題になるのは、コンビニ以外のグローバル変数を使用しない理由は他にありますか?パフォーマンスや互換性に関する問題はありますか?なぜグローバル変数は悪い習慣とみなされますか?

+2

[なぜグローバルが悪いのですか?](http://stackoverflow.com/questions/4246284/why-are-globals-bad)と[その他の質問](http://stackoverflow.com/search? q = javascript +なぜ+ +グローバル+変数+悪い)。 –

+2

JavaScriptやその他の言語では問題ありません。 [グローバルが悪い理由についての正式な回答](http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154)があります。 –

答えて

36

これらはグローバルな名前空間を混乱させ、ローカル変数よりもルックアップが遅くなります。

まず、変数をどこかに宣言して誤って別の場所に宣言してしまうことを忘れてしまうので、多くのグローバル変数を持つことは常に悪いことです。あなたの最初の変数がローカルの場合、問題はありません。グローバルであれば、上書きされました。これは暗黙のグローバルに入るとさらに悪化します(たとえば、varキーワードでsomeVarを宣言せずにsomeVar = someValueと言う場合)。

第2に、グローバル変数は、Javascriptがローカル変数よりも「見つける」に時間がかかります。速度の差は大きくありませんが、になります。

なぜグローバルが悪い習慣とみなされるのかについての詳細な解説と詳細については、this pageをチェックしてみてください。

0

基本的には、ページ上の任意のスクリプトからアクセスでき、同じスコープ内でその名前を繰り返すことができるためです。 JavaScriptエンジンの多くは、このコードを使用する理由です:

(function(){ 
    var foo = 'foo',//Local 
    bar = 'bar';//Local 
    window.globalVar = foo + bar;//Global 
})(); 
alert(foo);//Error 
alert(bar);//Error 
alert(globalVar);//'foobar' 
5

スクリプトが非常に長いですし、機能の多くから、これらの変数を使用する場合は、グローバル変数の値が変更されている可能性があるので、それはあなたのデバッグ時間を増加しますどこからでも、これが予期しない値に変更された場所をトラッキングしている場合は、それらをすべてチェックする必要があります。

このシナリオは、異なるプログラマがこの変数をページに含まれている他のスクリプトから変更すると、さらに痛いものになります。限り、あなたはuniqe namespase /オブジェクトの内部でそれらをラップしているとして、あなたのコード内でグローバル変数を使用して任意の問題があるべきではありません

+2

ハード・デバッグは、グローバルが悪い理由の1つに過ぎません。その他のものは[なぜグローバルが非常に悪いのか](http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154)にリストされています。 –

2

(あなたではないのスクリプトとの衝突を回避するため)

の1 adventageがありますjavascriptでグローバル変数を使用しており、javascriptは強力な型言語ではないという事実から派生しています。複雑なオブジェクトを関数の引数として渡すと、グローバルオブジェクトを代わりに使用している間に(関数スコープ内の)それらのオブジェクトのすべてのインテリジェンスをプローブで失うことになり、そのインテリセンスが保持されます。あなたが知性を持っているときに、実際にデバッグ時間を改善することができます(他の人たちとは対照的に)。

私は個人的に非常に役に立っています。

は大幅にあなたのコードの拡張性とテスト容易性を減少させ、

9

グローバル変数が大幅にカップリングを向上させることができます(もちろん、1はalwayse地元の人やグローバル変数間の適切なバランスを作る必要があります)。グローバルを使用し始めると、変数がどこでどのように変更されたかを知る必要があります(カプセル化を破るなど)。文献や慣習のほとんどは、グローバルを使うときのパフォーマンスが、あなたの懸念事項の中で最も少ないと主張します。

これはfantastic article outlining whyで、頭痛の原因になります。

+3

これは最高の答えです。 –

2

一言で言えば、グローバル変数は以下の問題を引き起こします。

1)変数ネーミングの衝突 - チームで作業しており、自分自身と同僚の両方がグローバルスコープで同じ変数名を使用している場合、最後に定義された変数は初期変数を上書きします。この明白なことは壊滅的な結果をもたらす可能性があります。

2)セキュリティ - 特にウェブ上では、すべてのユーザーがウィンドウ(またはグローバル)オブジェクトにアクセスできます。変数をグローバルスコープに置くことで、どのユーザーにも変数を表示または変更できるようになります。

3)遅い - これはおそらくごくわずかですが、まだ存在します。 JavaScript変数のルックアップの仕組みは、JavaScriptエンジンが変数が参照されている現在のスコープをルックアップします。見つからない場合は、次の親スコープを参照します。それが見つからなければ、変数を探しているグローバルオブジェクトに到達するまで上向きに見続けます。すべての変数がグローバルスコープに配置されている場合、JavaScriptエンジンは常にグローバルスコープに到達して変数を見つけるためにすべてのスコープを通過する必要があります。

関連する問題