10

質問があります: Javascript でスコープを制限するためのより良いアプローチは何ですか: 次のような名前空間を使用する:

var NAMESPACE = {};
NAMESPACE.foo = function() { 
   console.log('Hello');
}
NAMESPACE.foo();

または、このような自己呼び出し関数を使用する必要があります

(function() {
    function foo() { console.log('Hello'); }
    foo();
})();

名前空間を持つことは常に良いことですか?それとも、すべてのものを置く大きな自己呼び出し関数を 1 つだけ使用する場合は、名前空間を省略できますか?

4

4 に答える 4

7

両方のコード サンプルには、非常に異なるアプリケーションがあります。

NAMESPACE.foo = function(){}and(function(){})()は両方とも関数式であり、(関数宣言と同様に) 内部スコープを区切り、外部スコープの変数/関数にアクセスできます。

主な違いは、名前空間を使用すると、名前空間と同じスコープ内のどこでも関数を呼び出すことができるのに対し、IIFE は遭遇した場合にのみ実行されることです。

コンテキストのない「ベスト プラクティス」は存在しないため、いくつかの例を示します。

  • 関数式が 1 回だけ実行されると想定されている場合、IIFE は非常にうまく機能しますが、名前空間はガベージ コレクションされるまでメモリを消費します。
  • 関数式が複数回実行される場合 (forループ内など)、IIFE はパフォーマンスの低下を引き起こします (そして、 JSLintや実際には誰にも推奨されていません)。反復ごとに新しい関数オブジェクトを作成するよりも、複数回呼び出す定義済みの関数オブジェクトを用意する方が適切です。
  • 最終的には、ユーザー ケースによって異なります。IIFE は、検出されたときに実行されます (例: プログラム/関数本体、IF ブロックなど)。一方、名前空間は関数オブジェクトを格納し、指定されたスコープでアクセスできる場合はいつでも呼び出すことができます。

読み物

于 2012-09-07T08:33:06.097 に答える
3

私がやりがちなことは、2つを組み合わせることです。これがベストプラクティスと見なされるかどうかはわかりませんが、私にとってはうまくいきます:)

var app = { }; //or whatever your namespace is  

(function(){

app.memberA = {
   init: function() { },
   anotherFunction: function() { }
   // ...
};

})();

(function(){

app.memberB = {
   init: function() { }
   // So on...
};

})();

メンバー A と B は、別々の js リソース ファイルで定義され、実稼働用にバンドルおよび縮小されます。これにより、オブジェクト指向 JS を構築する際に問題が適切に分離されることがわかりました。

于 2012-09-07T08:30:13.580 に答える
0

名前空間を使用すると、何かがグローバル スコープに入ります。

すべてを関数にラップし、ローカルにスコープされた変数のみを使用しても、そうではありません。

スコープを制限するには、後者の方が明らかに優れています。

コードの一部をページ内の他のコードに公開する必要がある場合は、名前空間を使用します (これはライブラリで一般的です)。ただし、そのすべての部分を関数内で定義します。これにより、データがグローバルにエスケープされる可能性が減り、名前空間内の共有されたプライベート データのクロージャーが得られます。

于 2012-09-07T08:16:52.977 に答える
0

すべてのコードを自己呼び出し関数でラップする必要があります。一部の機能をアプリの他の部分と共有する必要がある場合は、それらのメソッドをカスタム名前空間に割り当てます。そうすれば、必要なものだけを正確に公開できます。

于 2012-09-07T08:27:25.660 に答える