1. Lingkup variabel
Untuk memahami penutupan, Anda harus terlebih dahulu memahami ruang lingkup variabel khusus JavaScript.
Hanya ada dua jenis lingkup variabel: variabel global dan variabel lokal.
Fitur khusus bahasa JavaScript adalah bahwa variabel global dapat dibaca secara langsung dalam fungsi.
var n = 999; fungsi f1 () {alert (n); } f1 (); // 999Di sisi lain, variabel lokal di dalam fungsi secara alami tidak dibaca di luar fungsi.
fungsi f1 () {var n = 999; } peringatan (n); // kesalahanAda tempat yang perlu diperhatikan di sini. Saat mendeklarasikan variabel secara internal, Anda harus menggunakan perintah VAR. Jika tidak, Anda benar -benar menyatakan variabel global!
fungsi f1 () {n = 999; } f1 (); waspada (n); // 9992. Bagaimana cara membaca variabel lokal dari luar?
Karena berbagai alasan, kadang -kadang kita perlu mendapatkan variabel lokal dalam fungsi. Namun, seperti yang disebutkan sebelumnya, dalam keadaan normal, ini tidak dapat dilakukan dan hanya dapat dicapai melalui solusi.
Yaitu mendefinisikan fungsi lain di dalam fungsi.
fungsi f1 () {var n = 999; function f2 () {alert (n); // 999}}Dalam kode di atas, fungsi F2 termasuk dalam fungsi F1, dan semua variabel lokal di dalam F1 terlihat oleh F2. Tapi sebaliknya tidak mungkin. Variabel lokal di dalam F2 tidak terlihat oleh F1. Ini adalah struktur "ruang lingkup rantai" yang unik untuk bahasa JavaScript. Objek anak akan terlihat ke atas level demi level untuk semua variabel objek induk. Oleh karena itu, semua variabel objek induk terlihat oleh objek anak, jika tidak itu tidak benar.
Karena F2 dapat membaca variabel lokal di F1, selama F2 digunakan sebagai nilai pengembalian, tidak bisakah kita membaca variabel internalnya di luar F1?
fungsi f1 () {var n = 999; function f2 () {alert (n); } return f2; } var result = f1 (); hasil(); // 9993. Konsep penutupan
Fungsi F2 di bagian kode sebelumnya adalah penutupan.
Definisi "penutupan" dalam berbagai dokumen profesional sangat abstrak dan sulit dipahami. Pemahaman saya adalah bahwa penutupan adalah fungsi yang dapat membaca variabel di dalam fungsi lain.
Karena dalam bahasa JavaScript, hanya subfungsi di dalam fungsi yang dapat membaca variabel lokal, penutupan dapat dengan mudah dipahami sebagai "fungsi yang didefinisikan di dalam fungsi".
Jadi, pada dasarnya, penutupan adalah jembatan yang menghubungkan bagian dalam dan bagian luar fungsi.
4. Tujuan penutupan
Penutupan dapat digunakan di banyak tempat. Ini memiliki dua kegunaan terbesar, satu adalah bahwa variabel di dalam fungsi dapat dibaca seperti yang disebutkan di atas, dan yang lainnya adalah bahwa nilai -nilai variabel ini selalu disimpan dalam memori.
Bagaimana cara memahami kalimat ini? Silakan lihat kode di bawah ini.
fungsi f1 () {var n = 999; nadd = function () {n+= 1} function f2 () {alert (n); } return f2; } var result = f1 (); hasil(); // 999 nadd (); hasil(); // 1000Dalam kode ini, hasilnya sebenarnya adalah fungsi penutupan F2. Total berjalan dua kali, nilai pertama adalah 999 dan nilai kedua adalah 1000. Ini membuktikan bahwa variabel lokal N dalam fungsi F1 telah disimpan dalam memori dan tidak secara otomatis dibersihkan setelah F1 dipanggil.
Mengapa ini terjadi? Alasannya adalah bahwa F1 adalah fungsi induk dari F2, dan F2 ditugaskan ke variabel global, yang menyebabkan F2 selalu ada dalam memori, dan keberadaan F2 tergantung pada F1. Oleh karena itu, F1 selalu dalam memori dan tidak akan didaur ulang oleh mekanisme pengumpulan sampah setelah panggilan selesai.
Titik penting lainnya dalam kode ini adalah bahwa baris "nadd = function () {n+= 1}" pertama kali digunakan sebelum NADD, jadi NADD adalah variabel global, bukan variabel lokal. Kedua, nilai NADD adalah fungsi anonim, dan fungsi anonim ini sendiri juga merupakan penutupan, sehingga NADD setara dengan setter, yang dapat beroperasi pada variabel lokal di dalam fungsi di luar fungsi.
5. Catatan tentang penggunaan penutupan
1) Karena penutupan akan menyebabkan semua variabel dalam fungsi disimpan dalam memori, dan konsumsi memori sangat besar, penutupan tidak dapat disalahgunakan, jika tidak itu akan menyebabkan masalah kinerja halaman web dan dapat menyebabkan kebocoran memori di IE. Solusinya adalah menghapus semua variabel lokal yang tidak digunakan sebelum keluar dari fungsi.
2) Penutupan akan mengubah nilai variabel di dalam fungsi induk di luar fungsi induk. Oleh karena itu, jika Anda menggunakan fungsi induk sebagai objek, gunakan penutupan sebagai metode publiknya, dan gunakan variabel internal sebagai properti pribadi, berhati -hatilah untuk tidak mengubah nilai variabel internal fungsi induk sesuka hati.