Penutupan mengacu pada fungsi yang memiliki izin untuk mengakses variabel dalam ruang lingkup fungsi lain, tetapi mekanisme konfigurasi ruang lingkup perlu diperhatikan, yaitu, penutupan hanya dapat memperoleh nilai terakhir yang berisi variabel apa pun dalam fungsi.
Seperti dalam kasus -kasus berikut:
function create () {var arr = new array (); untuk (var i = 0; i <10; i ++) {arr [i] = function () {return i;}; } return arr;} var c_arr = create (); for (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />"); }Hasil Eksekusi:
Di permukaan, tampaknya nilai I yang dikembalikan oleh setiap fungsi berbeda, misalnya, nilai C_ARR [0] harus 0, nilai C_ARR [1] harus 1, dan seterusnya. Setiap fungsi dapat diperoleh dengan mengembalikan 10. Mengapa?
Karena rantai lingkup setiap fungsi menyimpan objek aktif fungsi create (), mereka semua merujuk ke variabel yang sama i. Setelah loop berakhir, nilai i menjadi 10. Pada saat ini, setiap fungsi mengacu pada objek variabel yang sama yang menahan variabel i.
Kita dapat memaksa penutupan untuk berperilaku seperti yang diharapkan dengan membuat fungsi domain lain, sehingga setiap posisi sesuai dengan nilai yang sesuai.
function create () {var arr = new array (); untuk (var i = 0; i <10; i ++) {arr [i] = function (num) {return function () {return num; };}(Saya); } return arr;} var c_arr = create (); for (var i = 0; i <c_arr.length; i ++) {document.write ("c_arr ["+i+"] ="+c_arr [i] ()+"<br />"); }Hasil Eksekusi:
Tentukan fungsi anonim dan jalankan fungsi anonim segera untuk menetapkannya ke array. Di sini, fungsi anonim memiliki num parameter, yang merupakan nilai yang akan dikembalikan oleh fungsi akhir. Saat memanggil setiap fungsi, kita lulus dalam variabel i. Karena parameter fungsi dilewatkan berdasarkan nilai, nilai variabel saat ini saya akan ditugaskan ke parameter num. Di dalam fungsi anonim ini, num pengaksaan penutupan dibuat dan dikembalikan, sehingga setiap fungsi dalam array ARR memiliki salinan variabel NUM sendiri, sehingga dapat mengembalikan nilai numeriknya sendiri yang berbeda.
Contoh klasik
Mari kita lihat contoh klasik. Misalkan halaman memiliki satu set tag tombol. Kami menggunakan skrip untuk mengikat acara klik ke set tag tombol ini, dan saat mengklik, itu akan muncul tag mana ini.
<meta charset = "UTF-8"/> <button> pertama </button> <button> kedua </button> <button> ketiga </button> <button> keempat </button> <type skrip = "teks/javascript"> var obj = document.geteLementsbytagname ('tombol'); untuk (var i = 0; i <Obj.length = i++{i] {iP (var i = 0; i <Obj.length; function () {alert (i);}; } </script>Klik setiap hasil tombol
Di permukaan, tampaknya mengklik pada setiap label harus memunculkan angka yang berbeda
Yang pertama harus muncul 0;
Yang kedua harus muncul 1;
Dan sebagainya.
Tetapi hasilnya adalah bahwa semua tombol muncul 4, yang jelas bukan hasil yang kita inginkan.
Mari kita ubah program
<meta charset = "utf-8"/> <button> pertama </button> <button> kedua </button> <button> ketiga </button> <button> keempat </button> <script type = "text/javaScript"> var obj = document.geteLementsbytagname ('tombol'); untuk (var i = 0; i <bocument.lementsbytagname ('Tombol'); untuk (var i = 0; i <Obj.length; function () {alert (num);}} (i); } </script>Klik yang kedua
Klik pada yang keempat
Kita hanya perlu membuat fungsi anonim dalam fungsi, yang sama dengan kasus di atas. Fungsi anonim dapat diimplementasikan untuk menangkap variabel eksternal i, dan nilai i dari setiap tombol pop berbeda.