function box() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
}
}
return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
alert(b[i]);
}
Selepas box() dilaksanakan, mengapa nilai dalam arr[0] hingga arr[4] semua berfungsi () { return i;}
Mengapa mereka tidak: function () {return 0;}, function ( ) {kembali 1;}. . .
Oleh kerana penutupan hanya boleh mendapatkan nilai terakhir mana-mana pembolehubah dalam fungsi, yang di sini merujuk kepada pembolehubah i, fungsi kotak() mengembalikan tatasusunan fungsi selepas pelaksanaan, dan setiap i dalam tatasusunan merujuk kepada pembolehubah A yang sama i . Perhatikan bahawa box() mengembalikan fungsi! Jadi {return i} inside hanyalah pernyataan dalam fungsi dan belum dilaksanakan lagi, jadi sudah tentu {return i} kekal tidak berubah. Kerana ia merujuk kepada i luaran yang sama, apabila fungsi kotak() kembali, nilai pembolehubah luaran i ialah 5. Pada masa ini, setiap pulangan merujuk kepada objek pembolehubah yang sama yang menyimpan pembolehubah i, jadi jika dalaman The fungsi dalam arr[], nilai i di dalam setiap fungsi ialah 5.
Kerana rantai skop yang dikaitkan dengan penutupan adalah "hidup" Dan mereka berkongsi pembolehubah i , dan bukannya memberikan salinan berasingan nilai setiap pembolehubah terikat Mereka hanya rujukan i pada setiap peringkat tidak akan disimpan
Buku Rujukan: Panduan Definitif untuk JavaScript Bahagian 8.6.Dalam contoh, fungsi dalam gelung for hanya diberikan nilai dan tidak dilaksanakan, jadi nilai i hanya diperoleh apabila fungsi dalam tatasusunan dilaksanakan Pada masa ini, i hanya mempunyai nilai pada penghujung gelung. Tiada penutupan digunakan di tingkat atas, hanya fungsi tanpa nama yang dilaksanakan mendapat nilai i untuk setiap gelung
Kaedah: 1. Gunakan ES6 let untuk menggantikan var
function box() {
2. Gunakan penutupan
kotak fungsi() {
. Perkataan "penutupan" berasal daripada gabungan blok kod yang akan dilaksanakan (kerana pembolehubah bebas terkandung dalam blok, pembolehubah bebas ini dan objek yang dirujuknya tidak dilepaskan) dan pengikatan yang disediakan untuk pembolehubah bebas. Persekitaran pengkomputeran (skop) ---Baidu Encyclopedia
bermaksud
Ini adalah blok kod Fungsinya hanya untuk merujuk i, supaya pegangan i akan menghalang i daripada dilepaskan hanya blok kod ini Ia adalah, ia hanya akan mencari i apabila ia berjalan, jadi anda boleh mengeluarkan semua arr anda, dan semua output hendaklah 5
dikira hanya apabila
i
dipanggil.Apabila memanggil fungsi ini,
for
telah ditamatkan, jadi nilai semasa mengambilfor
已经结束,因此取i
的时候值是5
ialah5