Saya sudah lama berhubungan dengan JavaScript, dan setiap kali saya memahami penutupan, saya mencari pekerjaan di front-end web baru-baru ini, jadi saya perlu mengkonsolidasikan yayasan.
Artikel ini mengacu pada penutupan blog Joy_lee berdasarkan blognya dan berusaha untuk menjelaskan pemahaman saya dalam bentuk komentar. Jika ada ketidaksesuaian, kritik dan koreksi dipersilakan.
Dalam pemrograman lanjutan, ini dikatakan: Ketika fungsi lain didefinisikan di dalam fungsi, penutupan dibuat. Penutupan memiliki izin untuk mengakses semua variabel yang terkandung dalam fungsi.
(Bagaimana Anda memahami kalimat ini? Menurut kalimat ini, penutupan adalah fungsi bersarang! Fungsi bersarang tentu saja dapat mengakses variabel fungsi yang mengandungnya, dan tidak ada masalah.)
Secara umum, fungsi internal dapat mengakses variabel di tingkat sebelumnya atau bahkan tingkat global. Jadi beberapa orang memahami hal ini: melalui penutupan, akses eksternal ke variabel dalam fungsi lokal dapat dicapai.
(Jika kita hanya membagi ruang lingkup menjadi satu tingkat, anggaplah ruang lingkup global sebagai level pertama, di mana fungsi lingkup tubuh tubuh yang ditentukan adalah ruang lingkup tingkat kedua, dan fungsi lingkup internal tubuh yang terdefinisi berada di tingkat kedua, dan level yang tidak dapat diakses, variabel ini tidak dapat di tingkat yang kedua, variabel ini tidak dapat di level kedua. Ditemukan dalam ruang lingkup level ini, dan kemudian dicari ke level sebelumnya hingga level pertama global. Mekanisme pengumpulan sampah untuk tidak mendaur ulang sumber daya yang ditempati oleh rantai ini.
fungsi a () {var i = 0; function b () {alert (++ i); } return b; } var c = a (); C();Artinya, fungsi penutupan adalah bahwa setelah A dieksekusi dan dikembalikan, penutupan membuat mekanisme pengumpulan sampah JavaScript GC tidak memulihkan sumber daya yang ditempati oleh A, karena pelaksanaan fungsi internal B dari kebutuhan A mengandalkan variabel dalam a.
Karena adanya penutupan, setelah fungsi pengembalian, saya selalu ada. Dengan cara ini, setiap kali C () dieksekusi, saya adalah nilai yang saya waspada setelah menambahkan 1.
Kemudian, jika A tidak mengembalikan fungsi B, situasinya sama sekali berbeda. Karena setelah A dieksekusi, B tidak dikembalikan ke dunia luar A, tetapi hanya direferensikan oleh A, dan pada saat ini A hanya akan dirujuk oleh B, jadi fungsi A dan B dirujuk oleh satu sama lain tetapi tidak terganggu oleh dunia luar (dirujuk oleh dunia luar), fungsi A dan B akan diterapkan oleh GC.
Faktanya, penutupan yang memperluas siklus hidup variabel. Biasanya, ruang lingkup suatu fungsi, yaitu, variabel, akan dihancurkan setelah fungsi dieksekusi, tetapi ketika fungsi mengembalikan penutupan, selama penutupan tidak dilepaskan, seluruh rantai ruang lingkup akan menempati memori. (Penutupan memperpanjang siklus hidup variabel, yang mengacu pada kasus dirujuk pada tingkat pertama. Tetapi tanpa referensi ini, dapatkah penutupan masih disebut penutupan?)
Berbicara tentang rantai lingkup: yaitu, ruang lingkup fungsi sendiri, ruang lingkup fungsi dari lapisan sebelumnya ... dan ruang lingkup global. Saat mengakses variabel, jika Anda tidak memilikinya, cari lapisan demi lapis sampai seluruh dunia. Jika Anda belum memilikinya, Anda akan melaporkan kesalahan.
(Saya benar -benar ingin mengeluh bahwa rantai ruang lingkup penutupan melengkung.)
PS: Beberapa netizen merekomendasikan artikel lain untuk menganalisis konsep penutupan javascript . Apakah ini otoritatif? Akhirnya, ada konsep yang jelas:
Setelah banyak mengatakan, apa sebenarnya penutupan? Mari kita ringkas di bawah ini:
Penutupan adalah konsep yang menggambarkan fenomena di mana memori berada setelah eksekusi fungsi dirilis. Selama Anda memahami konsep inti ini, penutupan tidak sulit untuk dipahami.
Artikel di atas memungkinkan Anda memahami penutupan dalam satu kalimat (sederhana dan mudah dimengerti) adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.