Javascriptクロージャを使用する場合、オブジェクトリテラルとコンストラクタベースのオブジェクトの使用に違いはありますか?
構文の違いだけですか、それともクロージャーについて他の違いもありますか?2つの違いを説明する例は本当に役に立ちます。
Javascriptクロージャを使用する場合、オブジェクトリテラルとコンストラクタベースのオブジェクトの使用に違いはありますか?
構文の違いだけですか、それともクロージャーについて他の違いもありますか?2つの違いを説明する例は本当に役に立ちます。
クロージャーは、関数型プログラミングの機能です。オブジェクトやオブジェクト リテラルとは関係ありません。
次の回答を読んでください-クロージャについて非常によく説明しています: https://stackoverflow.com/a/12931785/783743
一般に、クロージャーは、クロージャーのスコープ外に移動するネストされた関数内の変数を閉じる関数です。例えば:
function getCounter() {
var count = 0;
return function counter() {
return ++count;
};
}
var counter = getCounter();
counter(); // 1
counter(); // 2
counter(); // 3
ここで、ネストされた関数が返される ( のスコープ外に移動する) ときに、ネストされた関数で使用されている変数を閉じるgetCounter
ため、関数はクロージャになります。count
counter
getCounter
閉じられた変数 (この場合count
は ) はupvalueと呼ばれます。クロージャーは、そうでなければスコープ外になる (ガベージ コレクションされる) 値を生きたままにすることができるため、重要です。これは、C/C++ や Java などの言語では不可能です。
クロージャーは、変数の関数スコープに関するものです。したがって、知っておくべき重要なことは、変数のスコープは変数が定義された関数であるということです。このスコープ内で実行される関数は、その親関数自体にアクセスできます。親関数は、その子のスコープ外にあるため、子関数変数にアクセスできません。
したがって、オブジェクト リテラル内の変数は、それが含まれる関数にスコープされます。(関数内にない場合は、グローバルスコープ内にあります)。コンストラクターは関数であるため、コンストラクターが定義する変数は、それ自体にスコープが設定され、外部からアクセスできません。コンストラクターにあるすべての内部メソッドは、それらの定義済み変数にアクセスできます。
クロージャーは、関数がそれ自体のスコープ外にある変数にアクセスし、その変数が他の何かによって変更または変更される可能性がある場合に作成されます...関数の実行が終了した後でも。
それが何かの助けになったことを願っています。