4

名前空間はグローバル スコープを「汚染」するため、使用しないように言われました。代替手段は何ですか?

たとえばウェブサイト用にユーティリティ関数や定数を定義したい場合、簡単な方法はそれらを名前空間で定義することです。これにより、グローバル スコープへのダメージが 1 つのオブジェクトのみに制限されます。

名前空間が悪い習慣である場合、いくつかの疑問が頭に浮かびます。

  1. なぜこの悪い習慣なのですか?
  2. この宣言の範囲は何ですか (Web アプリケーション / 動的 Web サイト / 静的 Web サイトなど)?
  3. 代替手段は何ですか?

この質問は、extend.js を使用する利点に関する投稿で開始された議論の結果です。

4

4 に答える 4

8

なぜこの悪い習慣なのですか?

名前空間自体は不必要な概念であるため、悪いものです。

プロパティとメソッドを持つオブジェクトを持つことは許容されます。「名前空間」に似た「モジュール」トークンを持つことも問題ありませんが、代わりに、すべてのプロパティとメソッドを含むファイルごとに 1 つの「モジュール」トークンを持つことを意味します。これは、単一のファイルでのみ作成/変更され、グローバルトークンとして公開されないため、「名前空間」とは異なります。

この宣言の範囲は何ですか (Web アプリケーション / 動的 Web サイト / 静的 Web サイトなど)?

すべての ECMAScript、新しいグローバル トークンを作成しない

代替手段は何ですか?

名前空間を持つよりも、複数の「ファイル ローカル」トークンを優先する必要があります。つまり、各ファイル/「モジュール」はクロージャーでラップする必要があり、このクロージャー内の複数のローカル変数にアクセスできる必要があります。

グローバル変数も、まったく必要ないため、悪いものです。グローバルを回避する方法は、すべてをクロージャーでラップし、外部の JavaScript ファイルをロードする方法を賢くすることです。

ゼロ グローバル モジュール ローダーの例

参考文献:

于 2012-04-07T11:56:15.690 に答える
3

なぜ名前空間が悪いことになるのか想像できません。私が知らない JavaScript に固有の名前空間の定義がない限り。

私は現在小さなライブラリに取り組んでおり、すべてが 1 つの最上位オブジェクト (名前空間?) に囲まれています。ウィンドウや組み込み型には何も設定しません。私のライブラリから何かが必要な場合は、kiloオブジェクトで利用できます。

私にとって、この「名前空間」を持つことは、ライブラリでメソッドを呼び出しているかどうかをすぐに知ることができるため、良い習慣です。window.alertページにロードされた別のライブラリを台無しにする可能性のあるメソッドをオーバーライドする必要はありません。カスタマイズされたバージョンに使用kilo.alertしてください (これは不自然な例ですが、要点を説明してくれることを願っています)。

于 2012-04-07T11:52:37.860 に答える
2

個人的には、グローバル スコープを汚染するべきではないと言う人は、「汚染」を適切に定義できていないと思います。Mathこれは、たとえば、ネイティブ オブジェクトである程度確認できます。私が知っている他のすべてのプログラミング言語には、すべての数学関数が単なる関数として含まれていますが、JS にはありません。ただし、これを極端にするとcore.dialog.alert、たとえば、代わりに単純なアラート ボックスが表示されます。

変数をきれいに保つために、すべてのコードをクロージャーで囲むのが好きです。ただし、私のメインの JS スクリプト ファイルは、グローバル スコープ内の一連のユーティリティ関数を定義してAlert()いますAJAX()。それらを頻繁に使用する場合は、名前空間の呼び出しでファイルを肥大化させたくありません。また、すべての変数をクロージャーで定義しているため、誤って関数を上書きするリスクはありません (クロージャー自体で上書きする可能性がありますが、グローバル スコープには影響しませんでした)。

全体として、名前空間は過大評価されています。windowすでにコードを書いているだけで、すべてのプロパティについて泣かないでください。

于 2012-04-07T11:44:41.253 に答える
0

JavaScript の「名前空間」は、実際には名前付きプロパティを持つ単なるオブジェクトです。他の OO 言語 (つまり、C++、C# など) では、次のことは必要ないと思います。

C# --

public static class MyAppName {}
public static class MyArea {}
public static class MySubArea {}

public static class Test {
  public string Property1 { get { return "test"; }}
}

あなたが持つことができるように

MyAppName.MyArea.MySubArea.Test.Property1;

基本的に、JS は実際には名前空間をサポートしていないため、人々は名前空間をシミュレートするためのハックを発明しました。

myAppSpace.mySubArea.myObject = blah...
于 2012-04-07T11:58:36.850 に答える