1

スタック オーバーフローに関する最近の質問 ( for ループを使用してコードを圧縮する) で、window オブジェクトを介して変数名をループできることを知りました。

これを読んだ後、これは悪い習慣と見なされているのか、これがパフォーマンスに何らかの影響を与えているのか疑問に思っていました.

たとえば、配列を使用している場合よりも多くの変数を作成しているため、これにより Javascript のパフォーマンスが低下すると思います。しかし、「変数」と「ウィンドウ[変数]」の直接名を介して変数にアクセスしている場合、これにも特定の影響がありますか? これは値を取得するための別のアプローチですか? それとも、これら 2 つの可能性はまったく同じことを行っているのでしょうか?


編集: @Tomalak が言ったように、私はそれらを経験していないので、パフォーマンスの問題を尋ねるのはおそらく無意味です。

ウィンドウオブジェクトに多くの変数名を配置するのは悪いハバビットであるため、代替の代わりにウィンドウ[変数]を使用するユースケースは何ですか?これのためのユースケースはありますか?

4

3 に答える 3

1

windowobject はすでに変数でいっぱいであり、インターネット上で世界的に最適なコーディング スタイルを指図しようとしている無数のスマートヘッドにもかかわらず、それは依然としてほとんど個人的な好みの問題です。人はやるべきことをしなければなりません。要するに、@Tomalak は彼のコメントでそれを釘付けにしました - 過度に設計する必要はありません。多くの場合、シンプルさが最善の方法です。

整然とした状態に保つ 1 つの方法は、独自のオブジェクトをwindow(に宣言し、window.myGlobals必要なものをすべてそのオブジェクトに入れることです。

于 2013-10-30T14:18:48.550 に答える
1

一般に、グローバル変数を使用することはお勧めできません。また、動的な変数名を使用することも悪い習慣と見なされます。これは、この手法を使用するときに行うことです。アイテムのリストを格納するには、配列を使用します。それが配列の目的です。

さて、計算時間に関しては...違いは数秒の分数のスケールにあります。ただし、window["variable" + i] is slowerbecause を使用して適切な値を検索するには、プロパティ文字列を連結する必要があります。配列では、インデックスを渡すだけで、何も連結したり、文字列に変換したりする必要はありません。これは、オブジェクト ルックアップで発生することです。したがって、回避window["variable" + i]は実際にはわずかに高速です。

実際に動的変数を使ったほうが便利な場合は、まあ、そう多くはありません。window[variableName]私が考えることができる唯一の可能な使用法はvariableName、呼び出す必要がある関数を参照する場合です。それは次のようになりますwindow["someFunction"]();

tl;dr : パフォーマンスに悪影響を与え (無視できる程度ではありますが)、いくつかのレベルで悪い習慣であるため、これを行わないでください。「問題ない」のは、関数を名前で呼び出すときだけです。ただし、その場合も注意が必要ですeval。これは、もちろん悪である を使用することとほとんど同じです。

于 2013-10-30T14:21:40.277 に答える
0

変数をグローバル スコープに配置すること (ブラウザーの場合はウィンドウ オブジェクトのプロパティとして) は、名前空間の汚染と呼ばれ、適切に分離されたモジュール コードと比較してコードの理解がはるかに難しくなるため、これは不適切な形式です。わかりにくいコードは、バグやメンテナンスの困難につながります。

一部の変数をグローバル スペースに配置する理由はいくつかあります (複数のスクリプトで必要とされるため) が、通常はできるだけ少数の変数を配置するのが一般的です。たとえば、jQuery ライブラリはjQueryオブジェクトをグローバル スコープに配置します。それ以外のものは、そのオブジェクトのプロパティとして自己完結型または公開されます。jQuery プラグインはそのオブジェクトを利用し、それを介してインターフェースも提供します。

あなたの特定のケースでは、localStorage から抽出され、番号付きの変数に配置された一連の情報がありました。window['id' + i] を使用したソリューションは、コードをほとんど変更しないパッチとして提供されますが、data[i] として単純にアクセスできる配列にすべてのデータをカプセル化するのが最善です。この配列もグローバル スコープ内にありますが、グローバル スコープ内の唯一の配列であることに注意してください。

于 2013-10-30T14:21:40.120 に答える