2

私は JavaScript を初めて使用し、コンストラクターとプロトタイプを使用したオブジェクトとクロージャーという 2 つの概念に混乱しています。

ここで、クロージャーとは、他の関数がネストされた関数とその環境を意味します。

これらの 2 つの概念は、ある観点からは似ているように思われます。

どちらにも変数があり、これは他の言語のフィールドのようなものです。最後に、それは環境と呼ばれます。これは、値と特定の変数の間の一種のバインディングだと思います。

さらに、どちらにも「方法」があります。最後に、内部のネストされた関数はこのように機能すると思います。

では、これら 2 つの概念の本質的な違いは何でしょうか? または、データを記憶する 2 つのアプローチの違いは何ですか?

上記の概念に間違いがあった場合は、訂正してください。ありがとうございます。

4

2 に答える 2

3

クロージャーは、実際には具体的なオブジェクトではなく、より概念的なものであるため、「メソッド」自体はありません。クロージャーは関数を使用して実装され、関数自体はメソッドを持つことができますが、クロージャーをメソッドを持つとは言いません。あなたが言うように、クロージャーは関数その環境に関する情報です。

一方、プロトタイプは基本的な JavaScript オブジェクトにすぎないため、プロトタイプにはメソッドがあると言えます。

于 2012-07-06T15:50:35.820 に答える
0

クロージャプロトタイプは実際には同じものではありません。

プロトタイプは、 (一言で言えば) 新しいオブジェクトが作成されるテンプレートです。たとえば、次のようになります。

 var someType = function()
 {
 };

 someType.prototype.someOtherFunction = function()
 {
 };

のインスタンスを作成すると、関数でsometypeあるsomeOtherFunctionメンバーがアタッチされます。さらに、他のインスタンスが値を取得します。したがって、たとえば次のように、関数を文字列に「追加」するのは簡単です。

String.prototype.doSomething = function() 
{

}

そして今、すべての文字列がこのメソッドを取得します。

クロージャーは実際には別のスコープ内のサブスコープであり、変数を外側のスコープから内側のスコープにキャプチャまたはクローズすることで、クロージャーになります。

たとえば、次のようになります。

function something()
{
    for(var j = 0; j < 10; j++)
    {
        setTimeout(function()
        {
            alert(j);
        }, 25);
    }
}

この状況では、 の値はコールバックjによってクローズされsetTimeoutます。他のコンテキストでjは、内部関数内には存在しませんが (関数のグローバルでも引数でもないため)、このように導入されているため、内部関数は変数参照を閉じると言われます。

于 2012-07-06T15:50:54.197 に答える