Penutupan ialah kesukaran dan ciri bahasa Javascript Banyak aplikasi lanjutan bergantung pada penutupan.
Penutupan mempunyai tiga ciri:
1. Fungsi bersarang fungsi
2. Parameter dan pembolehubah luaran boleh dirujuk di dalam fungsi
3. Parameter dan pembolehubah tidak akan dikitar semula oleh mekanisme kutipan sampah
Penutupan ialah fungsi yang mempunyai akses kepada pembolehubah dalam skop fungsi lain Cara paling biasa untuk membuat penutupan ialah mencipta fungsi lain dalam fungsi dan mengakses pembolehubah tempatan fungsi ini melalui fungsi lain
Menggunakan penutupan mempunyai kelebihan dan kekurangan, iaitu pembolehubah tempatan boleh berada dalam ingatan dan mengelak daripada menggunakan pembolehubah global. Pembolehubah global boleh dipanggil dalam setiap modul, yang pasti akan membawa bencana.
Jadi adalah disyorkan untuk menggunakan pembolehubah tempatan tertutup peribadi.
Selepas fungsi umum dilaksanakan, objek aktif tempatan dimusnahkan, dan hanya skop global disimpan dalam ingatan. Tetapi keadaan dengan penutupan adalah berbeza!
Penutupan fungsi bersarang:
function aaa() { var a = 1; return function(){ alert(a++) }; } var fun = aaa(); fun();// 1 执行后 a++,,然后a还在~ fun();// 2 fun = null;//a被回收!!
Hasil keluaran di atas ialah 5;
Penutupan akan sentiasa menyimpan pembolehubah dalam ingatan, yang akan meningkatkan penggunaan memori jika digunakan secara tidak betul.
(1). Dalam JavaScript, jika objek tidak lagi dirujuk, maka objek itu akan dikitar semula oleh GC; (2) Jika dua objek merujuk antara satu sama lain dan tidak lagi dirujuk oleh pihak ketiga, maka kedua-dua objek yang merujuk antara satu sama lain juga akan dikitar semula.
Jadi apakah faedah menggunakan penutupan? Faedah menggunakan penutupan adalah:
1. Inginkan pembolehubah berada dalam ingatan untuk jangka masa yang lama
2. Elakkan pencemaran pembolehubah global
3. Kewujudan ahli persendirian
1. Pengumpulan pembolehubah global
<script> var a = 1; function abc(){ a++; alert(a); } abc(); //2 abc(); //3 </script>
<script> function abc(){ var a = 1; a++; alert(a); } abc(); //2 abc(); //2 </script>
3. Pengumpulan pembolehubah setempat (apa yang boleh dilakukan oleh penutupan)
<script> function outer(){ var x=10; return function(){ //函数嵌套函数 x++; alert(x); } } var y = outer(); //外部函数赋给变量y; y(); //y函数调用一次,结果为11 y(); //y函数调用第二次,结果为12,实现了累加 </script>
Dalam js kita boleh mengisytiharkan fungsi melalui fungsi kata kunci:
<script> function abc(){ alert(123); } abc(); </script>
<script> (function (){ alert(123); })(); //然后通过()直接调用前面的表达式即可,因此函数可以不必写名字; </script>
<script> var abc = (function(){ //abc为外部匿名函数的返回值 var a = 1; return function(){ a++; alert(a); } })(); abc(); //2 ;调用一次abc函数,其实是调用里面内部函数的返回值 abc(); //3 </script>
<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(); //2 aaa.c() //3 </script>
<!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" /> <title></title> <script> window.onload = function(){ var aLi = document.getElementsByTagName('li'); for (var i=0;i<aLi.length;i++){ aLi[i].onclick = function(){ //当点击时for循环已经结束 alert(i); }; } } </script> </head> <body> <ul> <li>123</li> <li>456</li> <li>789</li> <li>010</li> </ul> </body> </html>