1

私はJavaScriptの世界に不慣れです。ここで説明するコードを分析して、Firefox拡張機能を作成する際のグローバルレベルでの汚染を回避しています。
コードが

1. // Namespace registration  
2. this.ns = function(fn) {  
3. var ns = {};  
4. namespaces.push(fn, ns);  
5. return ns;  
6. };  

実行中です理解できません: 1)コードが3行目でns = {}
を 宣言する 理由2)コードが5行目でnsを返す理由 3)どの関数が返されたns {}を受信し、この関数がそれをどのように使用するか 4 )ns {}は、登録されているすべての名前空間で常に同じ(?)です。したがって、コードがfn.apply(ns)を実行しているときに、名前空間配列にfnパラメーターと一緒にプッシュされ、提供されるのはなぜですか。 英語が下手でごめんなさい。よろしくお願いします。



4

1 に答える 1

3

これは名前空間を実装する最も一般的な方法ではありませんが、興味深い方法です。私はあなたの質問にできるだけ明確に答えようとします:

1.配列名前空間にプッシュされる関数は、グローバル名前空間を汚染しないように、独自のコンテキストを持つ必要があるためです。次のように宣言できます。

extension.ns(function () {
   this.myVar = 5;
});

this匿名関数が呼び出されるたびnsに、指定された関数に対応するオブジェクトになります。これは、関数が呼び出される方法(を使用apply)によるものです。

2.nsコンテキストオブジェクトにプロパティまたはメソッドを追加する必要がある場合があるため、コードが返されます。

3.与えられた例ではなし。使用する場合:

function foo() {
   alert(this.bar);
}

var ns = extension.ns(foo);
ns.bar = 'foobar';

関数fooが拡張機能から呼び出されると、「foobar」というテキストでアラートを受け取る必要があります(this関数本体ではnsオブジェクトになります)。

4.それぞれnsが異なります。異なるオブジェクトを作成するたびに使用する場合ns = {};、参照は異なるオブジェクトを指しているため、宣言された各関数の各コンテキストは異なります(コンテキストの場合はnsオブジェクトについて考えることができます)。

于 2013-02-18T11:39:31.300 に答える