40

JavaScript でグローバル変数を使用しないようにという警告が何度も表示されますが、人々がそう言う唯一の理由は、グローバル名前空間が詰まるからだと思われます。これは、すべての変数を 1 つの大きなオブジェクトに入れることで簡単に修正できると想像できます。問題は、利便性以外にグローバル変数を使用しない理由が他にあるということです。それらに関連するパフォーマンスまたは互換性の問題はありますか?

4

7 に答える 7

44

それらはグローバル名前空間を乱雑にし、ローカル変数よりもルックアップに時間がかかります。

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

次に、グローバル変数はローカル変数よりも Javascript の「検索」に時間がかかります。速度の違いはそれほど大きくありませんが、存在します。

なぜグローバルが悪い習慣と見なされるのかについての詳細な説明と詳細な説明については、このページをチェックしてください。

于 2012-05-09T23:34:06.590 に答える
15

グローバル変数は結合を大幅に増加させ、コードのスケーラビリティとテスト容易性を大幅に低下させる可能性があります。グローバルの使用を開始したら、変数がどこでどのように変更されるか (つまり、カプセル化を解除するか) を知る必要があります。そこにある文献や慣例のほとんどは、グローバルを使用する場合、パフォーマンスは最も重要ではないと主張しています。

これは、グローバル変数が頭痛の種となる理由を概説した素晴らしい記事です。

于 2014-07-24T20:55:25.563 に答える
7

簡単に言えば、グローバル変数は次の問題を引き起こします。

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

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

3) 遅い - これはほぼ間違いなく無視できますが、それでも存在します。JavaScript 変数ルックアップの仕組みは、JavaScript エンジンが、変数がルックアップされている現在のスコープでルックアップを行うことです。変数が見つからない場合は、次の親スコープでルックアップを行います。そこで見つからない場合は、その変数を探しているグローバル オブジェクトに到達するまで上向きに検索を続けます。すべての変数がグローバル スコープにある場合、JavaScript エンジンは、最終的にグローバル スコープに到達して変数を見つけるために、常にすべてのスコープを通過する必要があります。

于 2015-05-24T01:26:50.043 に答える
5

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

このシナリオは、別のプログラマーがページに含まれる他のスクリプトからこの変数を変更した場合、さらに困難になります。

于 2012-05-09T23:39:21.310 に答える
3

グローバル変数を一意の名前空間/オブジェクト内にラップしている限り、コードでグローバル変数を使用しても問題はありません (自分のものではないスクリプトとの衝突を避けるため)。

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

私は個人的にそれが非常に便利であると感じており、私のコードに確かに配置されています。

(もちろん、常にローカル変数とグローバル変数の間で適切なバランスを取る必要があります)

于 2012-07-17T07:17:10.060 に答える
1

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

(function(){
    var foo = 'foo',//Local
    bar = 'bar';//Local
    window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar );//'foobar'
于 2012-05-09T23:34:44.807 に答える
0

作成したグローバル変数は、既存のウィンドウ オブジェクト プロパティを上書きする可能性があります。グローバル変数はグローバルコンテキスト、つまりウィンドウオブジェクトでアクセスしているためです。

于 2018-10-06T17:43:28.377 に答える