私はJavaScriptでグローバル変数を使用しないように警告していますが、グローバル名前空間を詰まらせる理由があるというだけの理由があるようです。すべての変数を1つの大きなオブジェクトに入れることで、これを簡単に修正できると思います。ここで問題になるのは、コンビニ以外のグローバル変数を使用しない理由は他にありますか?パフォーマンスや互換性に関する問題はありますか?なぜグローバル変数は悪い習慣とみなされますか?
答えて
これらはグローバルな名前空間を混乱させ、ローカル変数よりもルックアップが遅くなります。
まず、変数をどこかに宣言して誤って別の場所に宣言してしまうことを忘れてしまうので、多くのグローバル変数を持つことは常に悪いことです。あなたの最初の変数がローカルの場合、問題はありません。グローバルであれば、上書きされました。これは暗黙のグローバルに入るとさらに悪化します(たとえば、var
キーワードでsomeVarを宣言せずにsomeVar = someValue
と言う場合)。
第2に、グローバル変数は、Javascriptがローカル変数よりも「見つける」に時間がかかります。速度の差は大きくありませんが、はになります。
なぜグローバルが悪い習慣とみなされるのかについての詳細な解説と詳細については、this pageをチェックしてみてください。
基本的には、ページ上の任意のスクリプトからアクセスでき、同じスコープ内でその名前を繰り返すことができるためです。 JavaScriptエンジンの多くは、このコードを使用する理由です:
(function(){
var foo = 'foo',//Local
bar = 'bar';//Local
window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar);//'foobar'
スクリプトが非常に長いですし、機能の多くから、これらの変数を使用する場合は、グローバル変数の値が変更されている可能性があるので、それはあなたのデバッグ時間を増加しますどこからでも、これが予期しない値に変更された場所をトラッキングしている場合は、それらをすべてチェックする必要があります。
このシナリオは、異なるプログラマがこの変数をページに含まれている他のスクリプトから変更すると、さらに痛いものになります。限り、あなたはuniqe namespase /オブジェクトの内部でそれらをラップしているとして、あなたのコード内でグローバル変数を使用して任意の問題があるべきではありません
ハード・デバッグは、グローバルが悪い理由の1つに過ぎません。その他のものは[なぜグローバルが非常に悪いのか](http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154)にリストされています。 –
(あなたではないのスクリプトとの衝突を回避するため)
の1 adventageがありますjavascriptでグローバル変数を使用しており、javascriptは強力な型言語ではないという事実から派生しています。複雑なオブジェクトを関数の引数として渡すと、グローバルオブジェクトを代わりに使用している間に(関数スコープ内の)それらのオブジェクトのすべてのインテリジェンスをプローブで失うことになり、そのインテリセンスが保持されます。あなたが知性を持っているときに、実際にデバッグ時間を改善することができます(他の人たちとは対照的に)。
私は個人的に非常に役に立っています。
は大幅にあなたのコードの拡張性とテスト容易性を減少させ、
グローバル変数が大幅にカップリングを向上させることができます(もちろん、1はalwayse地元の人やグローバル変数間の適切なバランスを作る必要があります)。グローバルを使用し始めると、変数がどこでどのように変更されたかを知る必要があります(カプセル化を破るなど)。文献や慣習のほとんどは、グローバルを使うときのパフォーマンスが、あなたの懸念事項の中で最も少ないと主張します。
これはfantastic article outlining whyで、頭痛の原因になります。
これは最高の答えです。 –
一言で言えば、グローバル変数は以下の問題を引き起こします。
1)変数ネーミングの衝突 - チームで作業しており、自分自身と同僚の両方がグローバルスコープで同じ変数名を使用している場合、最後に定義された変数は初期変数を上書きします。この明白なことは壊滅的な結果をもたらす可能性があります。
2)セキュリティ - 特にウェブ上では、すべてのユーザーがウィンドウ(またはグローバル)オブジェクトにアクセスできます。変数をグローバルスコープに置くことで、どのユーザーにも変数を表示または変更できるようになります。
3)遅い - これはおそらくごくわずかですが、まだ存在します。 JavaScript変数のルックアップの仕組みは、JavaScriptエンジンが変数が参照されている現在のスコープをルックアップします。見つからない場合は、次の親スコープを参照します。それが見つからなければ、変数を探しているグローバルオブジェクトに到達するまで上向きに見続けます。すべての変数がグローバルスコープに配置されている場合、JavaScriptエンジンは常にグローバルスコープに到達して変数を見つけるためにすべてのスコープを通過する必要があります。
- 1. 可変オブジェクトのロック - なぜそれは悪い習慣とみなされますか?
- 2. Javaではどのようなグローバル変数が悪い習慣ですか?
- 3. メソッドの静的なローカル変数は悪い習慣ですか?
- 4. callstackをブロックすることがRxJavaの悪い習慣とみなされるのはなぜですか?
- 5. JavascriptなぜFOR INは悪い習慣ですか?
- 6. これは悪い習慣ですか?
- 7. は、隠されたグローバルな悪いプログラミング練習ですか?
- 8. は@unlink悪い習慣ですか?
- 9. eslintrcファイルをグローバルにインストールすることは悪い習慣ですか?
- 10. フォークのマスターブランチにコミットするのはなぜ悪い習慣ですか?
- 11. フォームでフルネームを要求するのはなぜ悪い習慣ですか?
- 12. 静的なフィールドを持つのは悪い習慣ですか?
- 13. なぜグローバルは悪いですか?
- 14. npmからグローバルに物事をインストールするのは悪い習慣ですか?
- 15. JavaScriptの関数引数を変更するのは悪い習慣ですか?
- 16. C++ - クラス内のクラスオブジェクトプロパティではない変数を持つことは悪い習慣ですか?
- 17. 値を返し、それを悪い習慣とみなされる変数に格納していませんか?次の関数を考える
- 18. Java - クラスコンストラクタを持たないことは悪い習慣ですか?
- 19. なぜPHP内で場所の変更、悪い習慣のためにJavaScriptを使用していますか?
- 20. コード評価:これは悪い習慣と考えられますか?
- 21. BackPressedを呼び出すことは悪い習慣ですか?
- 22. コールバックの変数をシャドーするのは悪い習慣ですか?
- 23. 否定的なCSSルールを持つことは悪い習慣ですか?
- 24. スイッチケースにスイッチケースを入れるのは悪い習慣ですか?
- 25. rel = "ツールチップ"、それは悪い習慣ですか?
- 26. これは悪い習慣ですか? C++
- 27. これは悪い習慣です(これは間違っていますか)。
- 28. 拡張メソッドと拡張プロパティは悪い習慣ですか?
- 29. 初期化されていない変数を扱う慣習的な形式
- 30. "net/http"のグローバル変数の使用はgolangの良い習慣と考えられていますか?
[なぜグローバルが悪いのですか?](http://stackoverflow.com/questions/4246284/why-are-globals-bad)と[その他の質問](http://stackoverflow.com/search? q = javascript +なぜ+ +グローバル+変数+悪い)。 –
JavaScriptやその他の言語では問題ありません。 [グローバルが悪い理由についての正式な回答](http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154)があります。 –