9

JavaScript では、グローバル スコープ内で変数を宣言することが悪いことであることはよく知られています。そのため、私が作業する傾向があるコードには、名前空間付きの JavaScript が含まれています。

これには2つの異なるアプローチが取られているようです-

  1. アプリケーション固有の関数をライブラリの名前空間に追加します。$.myCarouselfunction
  2. 独自の名前空間の作成などMyApplication.myCarouselFunction

より良い解決策があるかどうか、または長所と短所の点で近い場所で会う傾向があるかどうかを知りたかった.

これまでのところライブラリを使用しないことに個人的に決めた理由は、分離/分離/ライブラリコードとの競合の欠如と、その名前空間を共有する可能性がある潜在的なプラグインです。私が考慮していないことはこれ以上ありますか?

4

5 に答える 5

16

このようなものを選ぶ上で最も重要なことはセマンティクスだと思います。

関数/クラスは、ライブラリ固有の機能を拡張または依存していますか? ライブラリの名前空間に配置します。

あなたの関数/クラス ライブラリは独立していますか? この場合、カスタム名前空間に配置することをお勧めします。これにより、最初に使用したライブラリの外でコードを再利用できます。

于 2010-06-30T23:40:08.693 に答える
3

個人的には、この種のアプローチが好きです。

(function(namespace) {

function myPrivateFunction(){};

namespace.myPublicFunction = function(){};

})($); // passing the $ namespace, but if it clutters, 
       // we can change it to something else
于 2010-07-03T12:13:21.187 に答える
2

同じ名前空間を使用して複数のライブラリを取り込もうとしたことがある場合は、衝突が発生する可能性が高いことに驚くかもしれません。また、この種のバグが頻繁に発生し、デバッグが困難になるという点で、非常にイライラする可能性があります。方法。衝突に関するあなたの直感は正しいと思います。また、独自の名前空間を定義するか、他の誰かの名前空間を再利用するかについて最も重要な考慮事項は、名前空間の所有権を尊重することです。つまり、別の名前空間を維持している人々と連絡を取り、彼らがあなたのしていることを知っている場合を除き、独自の名前空間を使用することをお勧めします。

名前空間の所有権に関するアドバイスを無視して既存の名前空間で API を定義することにした場合 (セマンティクスなどのために)、考慮すべきことの 1 つは、エクスポート関数を使用してエラーを検出することです。基本的に、最初に独自の名前空間で何かを定義してから、次の行に沿ってターゲット名前空間にエクスポートできます。

MyApplication.exportName = function(objToExportTo, name, obj) {
  if (objToExportTo[name] === undefined) {
    objToExportTo[name] = obj;
  } else {
    // Possibly assert!
  }
};

MyApplication.myCarouselFunction = function() { ... };
MyApplication.exportName($, 'myCarouselFunction', MyApplication.myCarouselFunction);
于 2010-07-03T07:45:15.713 に答える
1

私は自分でライブラリにカスタムコードを追加することを好む傾向があります。その最大の理由は、使用法のセマンティクスが組み込みコードとカスタムコード全体で一貫しているためです。そうは言っても、このアプローチの技術的な長所や短所は考えられません。競合についての懸念は妥当だと思いますが、おそらくそうは思われません(カスタム関数のいずれかと競合するコンポーネント/モジュールになってしまった場合は、コードを他の人のコードに置き換えている可能性があります)。

于 2010-06-13T23:33:00.777 に答える
1

正しい選択は、ターゲット環境によって異なります。2 つの名前空間のどちらかを選択していますが、どちらも任意に乱雑になる可能性があります。ライブラリの名前空間で競合が発生する可能性が高いと思われる場合は、ウィンドウの名前空間を使用する必要があります。ウィンドウの名前空間が混乱する可能性が高いと思われる場合は、ライブラリの名前空間を選択してください。

いずれの場合も、通常は「グローバル」名を 1 つだけ作成する必要があります。つまり、関数をライブラリの名前空間に配置する場合は、$.myFn という名前を付けないことをお勧めします。$.yaya3.myFn という名前を付けて、myFn を複数回呼び出す任意のコンテキストでローカル参照をキャッシュします。

関数を参照するためのベスト プラクティスの 1 つは、関数が存在する名前空間を引数として無名関数に渡すことです。

(function (yaya3) {   
var myFn = yaya3.myFn;
myFn("frobnard!");
}(window.yaya3)); // you could instead pass $.yaya3 or YUI.namespace("yaya3") here

これにより、別の名前空間に移動する必要があることがわかった場合に、はるかに簡単になります。

于 2010-06-30T23:30:07.553 に答える