8

Javascriptでは、名前空間とクロージャの違いは何ですか?彼らは私に非常に似ているようです。

編集

具体的には、この記事では名前空間とクロージャについて説明し、次のような文があります。

これからも、名前空間化されたオブジェクト構造に自然に適合しない変数を宣言したいという状況が発生します。ただし、これらの変数にグローバルスコープを持たせたくありません。ここで、自己呼び出し関数が登場します。

さらに、「オブジェクト名前空間」として、クロージャによく似たものを提供します。名前空間はクロージャーのように見えますが、そうではないかもしれません...?ヘルプ?

4

3 に答える 3

24

名前空間は基本的に、Object何かを押し込む興味深いプロパティがないため、スコープ内で類似した名前や競合する名前を持つ変数の束がありません。だから、例えば、

MyNS = {}
MyNS.x = 2
MyNS.func = function() { return 7; }

クロージャとは、関数がスコープ外になっている場合でも、関数で定義されていない変数の値を「保持」することです。次のようにします。

function makeCounter() { 
   var x = 0;
   return function() { return x++; }
}

させc = makeCounter()てから繰り返し呼び出すとc()、が表示されます0, 1, 2, 3, ...。これは、makeCounter'closes'を定義する内部無名関数のスコープがであるためです。そのため、スコープ外であっても、そのスコープxへの参照がxあります。

特に、そうするとd = makeCounter()d()は0からカウントを開始します。これは、の異なるインスタンスを取得するcためです。dx

于 2012-04-27T03:38:41.353 に答える
5

名前空間は通常、すべてのグローバル変数を1つのマスターグローバル変数の下にプロパティとして配置する方法です。したがって、1つの新しい真のトップレベルグローバル変数のみを追加します。グローバル名前空間の汚染を防ぎ、他のグローバル変数との競合の可能性を減らします。

そして名前空間の例:

var YUI = {};
YUI.one = function(sel) {...};
YUI.two = function(sel) {...};
YUI.three = function(sel) {...};

トップレベルのグローバル名前空間に1つの新しいアイテムYUIがありますが、YUI名前空間オブジェクトを介してグローバルにアクセス可能なアイテムが複数あります。

クロージャは、関数の内部部分への参照が持続するため、関数の実行の通常の終了を超えて持続する関数ブロックです。

function doSometing() {
    var x = 10;
    setTimer(function() {
        // this gets called after doSomething() has finished executing
        // but because of the function closure, the variables 
        // inside of the parent scope like x are still accessible
        x += 10;
    }, 1000);
}
于 2012-04-27T03:38:12.930 に答える
2

http://jibbering.com/faq/notes/closures/から:

クロージャは、その関数呼び出しから関数呼び出しの実行コンテキスト内で作成された関数オブジェクトを返し、その内部関数への参照を別のオブジェクトのプロパティに割り当てることによって形成されます。または、そのような関数オブジェクトへの参照を、たとえば、グローバル変数、グローバルにアクセス可能なオブジェクトのプロパティ、または外部関数呼び出しへの引数として参照によって渡されるオブジェクトに直接割り当てることによって。

名前空間は単なる慣例であり、グローバルスコープが変数で乱雑にならないように作成されたオブジェクトです。

于 2012-04-27T03:41:29.180 に答える