4

テスト変数で使用したいメソッドがさらにある変数apiがあり、両方ともグローバル コンテキストにあります。

それらをwindow.documentに置いた方がいいと思いますが、他にどんなオプションがあるのだろうか。

var api = (function(){

  this.run= function(){
    console.log("run api");
  };

  return this;

})();

// テストは別ファイル

var test = (function(one_){

  this.as = function(){
    console.log(one_.run());
  };


  return this;

})(one);


test.as();
4

3 に答える 3

4
var company = company || {} ;

company.doSomething = function() {
};

company.test = {};
company.test.submodule = {};
company.test.submodule.doSomething = function() {};

company.api = {};
company.api.submodule = {};

通常、変数をグローバルに定義することは避けてください。保守しやすいコードを明確にするには、オブジェクトを名前空間として使用し、グローバル名前空間を汚染しないようにします。

これにより、デフォルトの JS 機能も大幅に強化されます。あなたが本当にそれに熱心なら、require.jsあなたのプロジェクトに のようなものを追加してください。そうすれば、とても素敵な Java のような機能を手に入れることができます。

したがって、require.jscompany.apiをJava で行うのと同じように、company.testと を異なるファイルに配置することができます。requireimport company.testpackage

ネームスペースは非常に効率的な方法です。あなたは得る:

  1. 読みやすさ(世界で最も重要なこと!!)。
  2. 保守性。
  3. より高速なデバッグ。
  4. より速いアップグレード。
  5. ロジックと機能の効率的な分割。
  6. IEwindowglobalオブジェクトのバグを防ぎます。
  7. チームでの作業を可能にし、快適にします。
  8. 開発を大幅にスピードアップします。ほとんどの IDE は、名前空間オブジェクトにインデックスを付けて自動入力します。
  9. jsDoc タグを効果的に使用して、JavaScript コードを文書化できます。

重要

またthis、静的なコンテキストで使用するのはかなり危険です。JavaScript の命名規則では、static は小文字の char で始まる名前が付けられ、クラスは大文字の char で始まる名前が定義されます。もちろん、camelCase を使用してください。

繰り返しますが、非常に強力で便利な規則です。開発者に、何かが静的またはクラスであることを瞬く間に伝えます。たとえば、次の場合:

company.test.submodule.doSomething = function() {
    // this is a static function. It's a normal property, it's not nested under the prototype.
};

this代わりに、クラスを作成する場合は、参照を正しい方法で使用できます。

   // Notice Person starts with uppercase P.
company.test.subModule.Person = function(name) {
    this.name = name;
    this.numberOfEyes = 2;
};
company.test.subModule.Person.prototype.cryMeARiver = function() {
    console.log(this.name + " can cry a river.");
};

他の関数の中で、次のことができます。

company.api.someSubModule.peopleCryRivers = function() {
    // this is again a static context.
    var bodgan = new company.test.subModule.Person("Bogdan");
    var andreea = new company.test.subModule.Person("Andreea");
    bodgan.cryMeARiver();// will output "Bogdan can cry a river."
    andreea.cryMeARiver();// will output "Andreea can cry a river."
    // etc..
};
于 2013-04-22T12:17:10.333 に答える
1

に変数をアタッチすることwindow.documentは意味がありませんが、それらを にアタッチすることwindowは、グローバル名前空間で宣言することと同じです。

(グローバル) 変数を名前空間として作成し、他の変数をこれにアタッチできます。

var APP = {};
APP.api = ...

もちろん、これは「APP」という名前の別のオブジェクトと競合するリスクがあります。

別のオプションは、すぐに呼び出される関数式内で変数を単純にラップすることです。

(function() {
    var api = ...
}();

これにより、競合を作成できない IIFE 内でスコープが設定されます。また、変数がスコープ外になると、ガベージ コレクションの対象になることも意味します。

于 2013-04-22T12:40:33.763 に答える