javascript小記-閉包理解

6199 ワード

この数日間もいくつかjavascriptの知識を見ています.これは以前の復習です.今はメモしてください.便利です.後で調べます.
javascriptの高級な特性を研究する時、きっとクローズドの概念に出会って、自分も各種の復習資料の中で、異なった作者の異なっている理解を発見しました.もっと良い理解のために、みんなの見解をまとめました.
 
1、クローズドとは何ですか
クローズドの厳密な定義は「関数(環境)とその閉じられた自由変数からなる集合体です.この定義は分かりにくいので、私たちはしばらく管理しないでください.
実際には、クローズドは技術ではなく、言語の特性です.
分かりやすい話、javascriptの中ですべての関数はすべてひとつが閉じて包むので、しかし普通の意味の上で入れ子の関数は更に閉塞の特性を体現することができます.
 
2、閉包はいつ発生しますか?
まずは例を見ます.
①グローバル変数を内部関数で読みだします.
1 var n='fanfan';
2 
3 function f1(){
4 
5   alert(n);
6  
7 }
8 
9 f1(); //  fanfan
 
②関数外部読み出し関数内部変数
1 function f1(){
2 
3   var n='fanfan';
4 
5 }
6 
7 alert(n); // error
 
関数外部では関数内部変数を読み込めませんが、外部から内部変数を読み込むと次のような方法が使えます.
 1 function f1(){
 2 
 3   var n='fanfan';
 4 
 5     function f2(){
 6 
 7     alert(n);
 8 
 9   }
10 
11     return f2;
12 
13 }
14 
15 var result=f1();
16 
17 result(); // fanfan
 
このようにして、関数f 1の外部で内部の変数が読み取られ、このときには閉じられます.
したがって、関数が内部で定義されている関数を返すと、クローズドが発生します.(外部関数は内部関数の参照を返します.)
クローズドとは、関数の内部と関数の外部をつなぐ橋のことです.
 
クローズドは、返される関数だけでなく、この関数の定義環境も含む.
次の例で理解できます.
 1 var generateClosure = function() {
 2   var count = 0;
 3   var get = function() {
 4     count ++;
 5     return count;
 6   };
 7   return get;
 8 };
 9 var counter1 = generateClosure();
10 var counter2 = generateClosure();
11 console.log(counter1()); //    1
12 console.log(counter2()); //    1
13 console.log(counter1()); //    2
14 console.log(counter1()); //    3
15 console.log(counter2()); //    2
 
上記の例は、クローズドがどのように生成されるかを説明している.
counter 1とcounter 2は、それぞれゲナートCloosure()関数を呼び出して、二つのクローズドの例を生成した.
これらの内部参照count変数はそれぞれの動作環境に属します.
generate Cloosure()がget関数に戻るときに、getが参照できるゲナートCloseure()関数の内部変数(つまりcount変数)をひそかに返したと理解できます.
メモリ内にコピーを生成し、その後にgenerate Cloosure()が返した関数の二つの例のcounter 1とcounter 2が独立した.
 
3、クローズドの用途
①グローバルアクセス関数内部の属性
②オブジェクト指向プログラミング中、プライベート属性のシミュレーション