閉鎖は、JavaScript言語とその機能の難しさです。多くの高度なアプリケーションは、閉鎖に依存して実装しています。
閉鎖には3つの特性があります。
1。ネストされた関数関数
2。関数は内部の外部パラメーターと変数を参照できます
3.パラメーターと変数は、ごみ収集メカニズムによって収集されません
閉鎖は、別の関数の範囲内の変数にアクセスできる関数を指します。閉鎖を作成する最も一般的な方法は、ある関数内で別の関数を作成し、別の関数を介してこの関数のローカル変数にアクセスすることです。
クロージャーを使用することには利点があり、それはそれの欠点でもあります。つまり、メモリにローカル変数を存在し、グローバル変数の使用を避けることができます。グローバル変数は、すべてのモジュールで呼ばれ、壊滅的なものになるはずです。
したがって、プライベートでカプセル化されたローカル変数を使用することをお勧めします。
一般的な関数が実行された後、ローカルアクティブオブジェクトが破壊され、グローバルスコープのみがメモリに保存されます。しかし、閉鎖状況は異なります!
ネストされた関数の閉鎖:
関数aaa(){var a = 1; return function(){alert(a ++)}; } var fun = aaa(); fun(); // 1実行後、A ++、Aはまだ〜fun(); // 2 fun = null; // aがリサイクルされます! !上記の出力結果は5です。
閉鎖は常に変数をメモリに保ち、不適切に使用するとメモリ消費量が増加します。
JavaScriptのゴミコレクションの原則
(1)JavaScriptでは、オブジェクトがもはや参照されなくなった場合、オブジェクトはGCによってリサイクルされます。
(2)2つのオブジェクトが互いに参照し、第三者によって参照されなくなった場合、これらの2つのオブジェクトは互いを参照します。
では、閉鎖を使用することの利点は何ですか?閉鎖を使用する利点は次のとおりです。
1.変数が長い間記憶に留められていることを願っています
2。グローバル変数の汚染を避けてください
3。民間会員の存在
1。グローバル変数の蓄積
<script> var a = 1; function abc(){a ++;アラート(a);} abc(); // 2ABC(); // 3 </script>2。ローカル変数
<script> function abc(){var a = 1; a ++;アラート(a);} abc(); // 2ABC(); // 2 </script>では、ローカル変数と蓄積できるように、どのように変数Aを達成できますか?
3。ローカル変数の蓄積(閉鎖ができる)
<script>関数outer(){var x = 10; return function(){// function nested function x ++;アラート(x); }} var y = outer(); //外部関数は変数y; y()に割り当てられます。 // y関数は1回呼び出され、結果は11y()です。 // y関数は2回目と呼ばれ、結果は12で、蓄積</script>JSの関数宣言と関数式:
JSでは、キーワード関数を使用して関数を宣言できます。
<script> function abc(){alert(123);} abc(); </script>また、「()」を使用して、この宣言を式に変えることもできます。
<script>(function(){alert(123);})(); //以前の式を介して直接呼び出すので、関数は名前を書く必要がありません; </script>4.グローバル変数の汚染を減らすためのモジュラーコード
<script> var abc =(function(){// abcは、外部匿名関数のreturn値var a = 1; return function(){a ++; alert(a);}})(); abc(); // 2; ABC関数を1回呼び出すことは、実際には内部関数abc()の返品値を呼び出しています。 // 3 </script>5。民間会員の存在
<script> var aaa =(function(){var a = 1; function bbb(){a ++; alert(a);} function ccc(){a ++; alert(a);} return {b:bbb、// json構造c:ccc}})(); aaa.b(); //2aaa.c()// 3 </script>6.ループ内の対応する要素のインデックスを直接見つけます
<!doctype html public " - // w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en"> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> <titl> <title> <crupt> <scrip document.getElementsByTagname( 'li'); for(var i = 0; i <ali.length; i ++){ali [i] .onclick = function(){//クリックすると、forループはアラート(i)を終了しました。 }; }} </scrip> </head> <body> <ul> <li> <li> 123 </li> <li> 456 </li> <li> 789 </li> <li> 010 </li> </ul> </body> </html> </html>7.閉鎖を使用して、上記のコードを書き換えます。
<!doctype html public " - // w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en"> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> <titl> <title> <crupt> <scrip document.getElementsByTagname( 'li'); for(var i = 0; i <ali.length; i ++){(function(i){ali [i] .onclick = function(){alert(i);};})(i); }}; </script> </head> <body> <ul> <li> 123 </li> <li> 456 </li> <li> 789 </li> </ul> </body> </html>