Penutupan Js Perkara yang perlu diketahui sebelum penutupan 1. Skop fungsi (1) Perkara istimewa tentang bahasa Js ialah pembolehubah global boleh dibaca terus di dalam fungsi Salin kod Kod adalah seperti berikut: <br> var n=100;<br> fungsi induk(){<br> makluman(n);<br> }<br> ibu bapa();//100<br> </skrip><br> </div> <p>Jika dalam php</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="79560" class="copybut" id="copybut79560" onclick="doCopy('code79560')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code79560"> <br> <?php<br /> $n=100;<br /> fungsi induk(){<br /> echo $n;<br /> }<br /> parent();//akan melaporkan ralat n tidak ditentukan<br /> ?><br> </div> <p>(2) Pembolehubah setempat dalam fungsi tidak boleh dibaca di luar fungsi</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="57533" class="copybut" id="copybut57533" onclick="doCopy('code57533')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code57533"> <br> <script type="text/javascript"><br> fungsi induk(){<br> var m=50;<br> }<br> ibu bapa();<br> alert(m);//ralat m tidak ditakrifkan<br> </skrip><br> </div> <p>Perhatikan bahawa var mesti ditambah apabila mengisytiharkan pembolehubah di dalam fungsi, jika tidak pembolehubah global akan diisytiharkan</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="97054" class="copybut" id="copybut97054" onclick="doCopy('code97054')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code97054"> <br> fungsi induk(){<br> m=50;<br> }<br> ibu bapa();<br> makluman(m);//50<br> </div> <p>//Sudah tentu ini lebih benar dalam php, </p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="78491" class="copybut" id="copybut78491" onclick="doCopy('code78491')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code78491"> <br> <?php<br /> fungsi induk(){<br /> global $m;//global, definisi dan tugasan harus diasingkan <br /> $m=50;<br /> }<br /> ibu bapa();<br /> echo $m;//50<br /> ?><br> //Jika tiada global, ralat yang tidak ditentukan masih akan dilaporkan<br> </div> <p>Kadangkala, jika anda perlu mendapatkan pembolehubah tempatan di dalam fungsi, anda perlu menggunakan ciri-ciri skop pembolehubah js dengan cara yang fleksibel, seperti mentakrifkan sub-fungsi di dalam fungsi fungsi induk adalah globalnya dan Fungsi anak boleh mengakses pembolehubah dalam fungsi induk (yang merupakan pembolehubah tempatan untuk keseluruhan kod js)</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="60738" class="copybut" id="copybut60738" onclick="doCopy('code60738')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code60738"> <br> <script type="text/javascript"><br> fungsi induk(){<br> var m=50;<br> fungsi anak(){<br> makluman(m);<br> }<br> Pulanglah nak;<br> }<br> var s=parent();//Simpan hasil dalam <br> global s();//50<br> </skrip><br> </div> <p>Semua pembolehubah tempatan di dalam Induk boleh dilihat oleh fungsi anaknya, tetapi pembolehubah setempat dalam fungsi anaknya tidak boleh dilihat oleh fungsi induknya Ini ialah struktur skop rantaian unik objek Anak akan Cari semua pembolehubah induk objek ke atas satu peringkat pada satu masa Semua pembolehubah objek induk kelihatan kepada objek anak, dan sebaliknya adalah tidak benar! Fungsi anak di atas adalah penutup<br> Sesetengah pelajar mungkin seperti ini </p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="87441" class="copybut" id="copybut87441" onclick="doCopy('code87441')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code87441"> <br> fungsi induk(){<br> var m=50;<br> fungsi anak(){<br> makluman(m);<br> }<br> }<br> ibu bapa();<br> son()//Report function son tidak ditentukan<br> </div> <p>Perhatikan bahawa dalam JavaScript, fungsi yang diisytiharkan dalam fungsi adalah setempat dan dikeluarkan selepas fungsi selesai dijalankan<br> Perhatikan perbezaan antara ini dan php</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="7331" class="copybut" id="copybut7331" onclick="doCopy('code7331')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code7331"> <br> <?php<br /> fungsi induk(){<br /> fungsi anak(){<br /> $m=50;<br /> echo $m;<br /> }<br /> }<br /> ibu bapa();<br /> son();//Output 50 dan tiada ralat akan dilaporkan<br /> ?><br> </div> <p><strong>Penutupan<br> </strong></p> <p>Tentukan fungsi di dalam fungsi, jambatan yang menghubungkan bahagian dalam dan luar fungsi<br> Penutupan mempunyai dua fungsi: <br> Satu ialah bacaan pembolehubah yang disebut sebelum ini di dalam fungsi, <br> Yang kedua ialah menyimpan nilai pembolehubah ini dalam ingatan untuk mencapai perkongsian data<br> Berikut ialah beberapa contoh penutupan</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="74219" class="copybut" id="copybut74219" onclick="doCopy('code74219')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code74219"> <br> <script type="text/javascript"><br> var cnt=(function(){<br> var i=0;<br> Kembalikan fungsi(){<br> makluman(i);<br> i ;<br> }<br> })();<br> cnt();//0<br> cnt();//1<br> cnt();//2<br> cnt();//3 <p></skrip><br> </p> </div> <p>Hasil pelaksanaan fungsi tanpa nama (iaitu, pengisytiharan sub-fungsi dalaman diberikan kepada pemotongan pembolehubah global), i disimpan dalam memori <br> Apabila melaksanakan cut(), nilai diperoleh terus daripada memori Hanya fungsi cnt() boleh memanggil i, dan direct alert(i) tidak akan berfungsi <br> Anda juga boleh menghantar parameter ke dalam penutupan </p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="73555" class="copybut" id="copybut73555" onclick="doCopy('code73555')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code73555"> <br> var cnt=(function(num){<br> kembalikan fungsi(){<br> makluman(bilangan);<br> nombor ;<br> }<br> })(5);<br> cnt();//5<br> cnt();//6<br> cnt();//7<br> //Sudah tentu, anda juga boleh lulus parameter semasa memanggil<br> var cnt=(function(){<br> var i=0;<br> kembalikan fungsi(bilangan){<br> num =i;<br> makluman(bilangan);<br> saya ;<br> }<br> })();<br> cnt(1);//1<br> cnt(2);//3<br> cnt(3);//5<br> </div> <p>Untuk mendapatkan pemahaman yang lebih baik tentang penutupan, mari lihat kod berikut<br> Sebagai contoh, saya ingin mengembalikan tatasusunan Terdapat 5 fungsi dalam tatasusunan Fungsi pertama muncul 0, yang kedua muncul 1... <br> Jika kod ditulis seperti ini</p> <p></p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="48988" class="copybut" id="copybut48988" onclick="doCopy('code48988')"><u>Salin kod</u></a></span> Kod adalah seperti berikut:</div> <div class="codebody" id="code48988"> <br> kotak fungsi(){<br> var arr=[];<br> untuk(i=0;i<5;i ){<br> arr=function(){return i;}<br> }<br> kembali arr; }<br> var a=box();<br> alert(a);//Array yang mengandungi lima badan fungsi<br> makluman(a[0]());<br> makluman(a[1]());<br> <br> </div> Badan fungsi timbul<p> function(){return i;} }<br> I yang terakhir ialah 4, dan kemudian ia menjadi 5<br> Untuk hentian gelung<br> Didapati bahawa 5 muncul, yang jelas tidak memenuhi keperluan kami <br> </p> <p>Penyelesaian 1<strong> <br>Melaksanakan fungsi dengan segera di dalam</strong> </p> <p></p> <div class="codetitle"><span><a style="CURSOR: pointer" data="22689" class="copybut" id="copybut22689" onclick="doCopy('code22689')">Salin kod<u></u></a> Kod adalah seperti berikut:</span></div> <div class="codebody" id="code22689"> kotak fungsi(){<br> var arr=[];<br> untuk(i=0;i<5;i ){<br> arr=(fungsi(nombor){kembali i;})(i);<br> }<br> kembali arr; }<br> var a=box();<br> untuk(var i=0;i<a.length;i ){<br> makluman(a);<br> }<br> <br><br> </div>Tetapi kami mendapati bahawa elemen dalam tatasusunan yang dikembalikan adalah hasil pelaksanaan fungsi, tetapi apa yang kami mahu ialah fungsi itu perlu meningkatkan kod kami <p> <br></p>Penyelesaian 2<p><strong> Pelaksanaan penutupan</strong> <br></p> <p></p> <div class="codetitle"><span>Salin kod<a style="CURSOR: pointer" data="75028" class="copybut" id="copybut75028" onclick="doCopy('code75028')"><u></u> Kod adalah seperti berikut:</a></span></div> kotak fungsi(){<div class="codebody" id="code75028"> var arr=[];<br> untuk(var i=0;i<5;i){<br> <br> arr=(fungsi(nombor){ Kembalikan fungsi(){return num;}<p> })(i);<br> <br> }</p> kembali arr; <p> }<br> <br>var arr=box();</p> <p>untuk(var i=0;i<5;i ){</p> <p> makluman(arr());//0,1,2,3,4</p> }<p> <br><br> </p> </div>Kod kunci <p></p> <p></p> <div class="codetitle"><span>Salin kod<a style="CURSOR: pointer" data="18012" class="copybut" id="copybut18012" onclick="doCopy('code18012')"><u></u> Kod adalah seperti berikut:</a><div class="codebody" id="code18012"> <br> arr=(fungsi(nombor){ <br> return function(){return num;}<br> })(i); <p><br> Apabila i=0 <br> arr[0]=(fungsi(nombor){return function(){return num;}})(0);</p> <p>Pukul 1</p> <p><br> arr[1]=(function(num){return function(){return num;}})(1); <br></p> </div> Di atas adalah faedah penutupan! Ia sangat mudah dan praktikal. <p></p></span></div>