Anda sedang mengusahakan projek dan anda memerlukan fungsi untuk "mengingat" nilai pembolehubah—walaupun selepas fungsi itu selesai dijalankan. Penutupan adalah seperti beg galas ajaib yang membolehkan anda membawa pengetahuan dari pelajaran sebelumnya ke mana sahaja anda pergi dalam kod anda. Ia merupakan salah satu konsep yang paling berkuasa namun disalahfahamkan dalam JavaScript. Tetapi jangan risau—menjelang penghujung panduan ini, penutupan akan berubah daripada menggaru kepala kepada "aha!"
Penutupan ialah apabila fungsi "mengingat" keadaan sekelilingnya (pembolehubah dalam skopnya) walaupun selepas fungsi luar selesai dilaksanakan. Mari kita pecahkan ini dengan analogi yang boleh dikaitkan:
Bayangkan anda seorang pelajar. Anda mempunyai beg galas dengan nota, pen dan buku anda. Anda meninggalkan bilik darjah (fungsi luar anda), tetapi anda masih mempunyai akses kepada segala-galanya dalam beg galas anda (penutupan anda). Bila-bila masa anda perlu menyelesaikan masalah kemudian, anda boleh mengeluarkan pengetahuan yang anda simpan dalam beg galas anda.
Dalam JavaScript, penutupan berlaku apabila:
Mari kita lihat penutupan dalam tindakan dengan contoh kod.
function outerFunction() { const outerVariable = 'Hello, Closure!'; function innerFunction() { console.log(outerVariable); } return innerFunction; } const myClosure = outerFunction(); myClosure(); // Output: "Hello, Closure!"
Apa Yang Berlaku Di Sini?
function createCounter() { let count = 0; return function () { count++; return count; }; } const counter = createCounter(); console.log(counter()); // Output: 1 console.log(counter()); // Output: 2
Apa Yang Berlaku Di Sini?
Penutupan sering menyebabkan pembangun tersandung apabila digunakan di dalam gelung.
for (let i = 1; i <= 3; i++) { setTimeout(() => console.log(i), i * 1000); } // Output: 1, 2, 3 (each after 1 second)
Mengapa Ini Berfungsi?
? Dokumentasi: Penutupan pada MDN
Penutupan bukan sekadar konsep teori—ia sangat praktikal! Berikut ialah beberapa senario biasa di mana penutupan bersinar.
Penutupan boleh menyimpan nilai yang dikira untuk digunakan semula, menjimatkan masa dan sumber.
function outerFunction() { const outerVariable = 'Hello, Closure!'; function innerFunction() { console.log(outerVariable); } return innerFunction; } const myClosure = outerFunction(); myClosure(); // Output: "Hello, Closure!"
Penutupan sering digunakan dalam pendengar acara untuk mengekalkan keadaan.
function createCounter() { let count = 0; return function () { count++; return count; }; } const counter = createCounter(); console.log(counter()); // Output: 1 console.log(counter()); // Output: 2
Anda boleh menggunakan penutupan untuk mencipta pembolehubah peribadi, merangkum fungsi.
for (let i = 1; i <= 3; i++) { setTimeout(() => console.log(i), i * 1000); } // Output: 1, 2, 3 (each after 1 second)
Penutupan membolehkan anda:
Penutupan adalah seperti pisau Swiss Army dalam JavaScript. Sama ada anda menyimpan data dalam cache, mengendalikan acara atau membuat pembolehubah peribadi, penutupan memberi anda cara yang berkesan untuk mengurus keadaan dalam apl anda.
Cabaran Anda: Cuba gunakan penutupan dalam projek kecil, seperti membina kaunter ringkas atau mencipta mekanisme caching. Anda akan kagum melihat sejauh mana penutupan kawalan memberi anda!
Jika anda menyukai artikel ini, pertimbangkan untuk menyokong kerja saya:
Atas ialah kandungan terperinci Memahami Penutupan dalam JavaScript: Daripada Kekeliruan kepada Kejelasan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!