Salah satu ciri terpenting dalam Javascript ialah penggunaan penutupan. Oleh kerana penggunaan penutupan, skop semasa sentiasa boleh mengakses skop luaran. Oleh kerana Javascript tidak mempunyai skop peringkat blok, hanya skop fungsi, penggunaan penutupan berkait rapat dengan fungsi.
Pembolehubah persendirian olok-olok
Di sini Kaunter mengembalikan dua penutupan: fungsi kenaikan dan perolehan. Kedua-dua fungsi ini mengekalkan akses kepada skop Kaunter, supaya mereka sentiasa boleh mengakses kiraan pembolehubah yang ditakrifkan dalam skop Kaunter.
Cara pembolehubah persendirian berfungsi
Memandangkan Javascript tidak boleh menetapkan atau merujuk skop, dalam contoh di atas, tiada cara untuk mengakses terus kiraan pembolehubah peribadi dalaman dari luar. Satu-satunya cara untuk mengaksesnya ialah dengan menentukan penutupan.
Kod di atas tidak akan mengubah nilai pembolehubah kiraan dalam skop Kaunter kerana penggodaman tidak ditakrifkan dalam Kaunter. Kod di atas hanya akan membuat atau menulis ganti kiraan pembolehubah global.
Penutupan dalam satu gelung
Salah satu kesilapan yang paling biasa ialah menggunakan penutupan di dalam gelung.
Kod di atas tidak akan mengeluarkan 0 hingga 9, tetapi akan mengeluarkan 10 kali secara berterusan.
Ketidaknamaan di atas akan sentiasa mengekalkan rujukan kepada pembolehubah i. Apabila fungsi console.log dipanggil untuk memulakan output, gelung telah tamat dan pembolehubah i sudah 10.
Untuk mengelakkan ralat di atas, kita perlu mencipta salinan pembolehubah nilai i setiap kali melalui gelung.
Elakkan ralat petikan
Untuk menyalin nilai pembolehubah dalam gelung, cara terbaik ialah menambah fungsi pelaksanaan segera tanpa nama di lapisan luar.
Fungsi tanpa nama luar ini menerima pembolehubah gelung i sebagai parameter pertama dan menyalin nilainya ke parameternya sendiri e.
Fungsi tanpa nama luaran menghantar parameter e kepada setTimeout, jadi setTimeout mempunyai rujukan kepada parameter e. Dan nilai parameter e ini tidak akan berubah kerana perubahan gelung luaran.
Terdapat cara lain untuk mencapai kesan yang sama, iaitu mengembalikan fungsi tanpa nama dalam fungsi tanpa nama dalam setTimeout:
Selain itu, ini juga boleh dicapai melalui kaedah bind.
Pada akhir artikel, mari kita ringkaskan:
(1) Penutupan ialah prinsip reka bentuk yang memudahkan panggilan pengguna dengan menganalisis konteks, membolehkan pengguna mencapai tujuannya tanpa mengetahui
(2) Artikel arus perdana mengenai analisis penutupan di Internet sebenarnya bertentangan dengan prinsip penutupan Jika anda perlu mengetahui butiran penutupan untuk menggunakannya dengan baik, penutupan adalah kegagalan reka bentuk
(3) Belajar sesedikit mungkin.