Penutupan JS
Apa yang harus diketahui sebelum penutupan
1. Lingkup fungsi
(1). Fitur khusus bahasa JS adalah bahwa variabel global dapat dibaca langsung di dalam fungsi
Salinan kode adalah sebagai berikut:
<type skrip = "Teks/JavaScript">
var n = 100;
function parent () {
waspada (n);
}
Parent (); // 100
</script>
Jika dalam php
Salinan kode adalah sebagai berikut:
<? php
$ n = 100;
function parent () {
gema $ n;
}
parent (); // kesalahan akan dilaporkan dan tidak ditentukan
?>
(2). Variabel lokal di dalam fungsi tidak dapat dibaca di luar fungsi
Salinan kode adalah sebagai berikut:
<type skrip = "Teks/JavaScript">
function parent () {
var m = 50;
}
induk();
waspada (m); // kesalahan m tidak didefinisikan
</script>
Perhatikan bahwa ketika mendeklarasikan variabel secara internal, Anda harus menambahkan VAR, jika tidak, variabel global akan dinyatakan.
Salinan kode adalah sebagai berikut:
function parent () {
m = 50;
}
induk();
Peringatan (m); // 50
// Tentu saja ini bahkan lebih di PHP.
Salinan kode adalah sebagai berikut:
<? php
function parent () {
global $ m; // global, definisi dan penugasan harus dipisahkan
$ m = 50;
}
induk();
Echo $ m; // 50
?>
// Jika tidak ada global, tidak akan ada kesalahan definisi
Terkadang, jika Anda perlu mendapatkan variabel lokal di dalam fungsi, Anda perlu menggunakan karakteristik ruang lingkup variabel JS. Misalnya, mendefinisikan fungsi anak di dalam fungsi, untuk fungsi anak, fungsi induk adalah globalnya, dan fungsi anak dapat mengakses variabel dalam fungsi induk (untuk seluruh kode JS, ini adalah variabel lokal)
Salinan kode adalah sebagai berikut:
<type skrip = "Teks/JavaScript">
function parent () {
var m = 50;
function son () {
peringatan (m);
}
putra yang kembali;
}
var s = parent (); // simpan hasilnya secara global
s (); // 50
</script>
Semua variabel lokal dalam orang tua terlihat oleh fungsi anak mereka, tetapi variabel lokal dalam fungsi anak mereka tidak terlihat oleh fungsi orang tua mereka. Ini adalah struktur ruang lingkup rantai yang unik untuk JS. Objek anak akan mencari semua variabel objek induk level berdasarkan level. Semua variabel objek induk terlihat oleh objek anak, jika tidak itu tidak benar! Fungsi putra di atas adalah penutupan
Beberapa siswa mungkin melakukan ini
Salinan kode adalah sebagai berikut:
function parent () {
var m = 50;
function son () {
peringatan (m);
}
}
induk();
son () // fungsi putra tidak didefinisikan
Perhatikan bahwa dalam JavaScript, fungsi yang dinyatakan dalam fungsi adalah lokal, dan mereka dirilis setelah fungsi dijalankan.
Perhatikan perbedaan antara ini dan PHP
Salinan kode adalah sebagai berikut:
<? php
function parent () {
function son () {
$ m = 50;
menggemakan $ m;
}
}
induk();
son (); // output 50 tidak akan melaporkan kesalahan
?>
Penutup
Fungsi secara internal mendefinisikan fungsi, jembatan yang menghubungkan fungsi internal dan eksternal
Ada 2 fungsi penutupan:
Pertama, fungsi baca di dalam variabel yang disebutkan di atas,
Yang kedua adalah menyimpan nilai -nilai variabel ini dalam memori untuk mewujudkan data
Berikut adalah beberapa contoh penutupan
Salinan kode adalah sebagai berikut:
<type skrip = "Teks/JavaScript">
var cnt = (function () {
var i = 0;
return function () {
waspada (i);
i ++;
}
}) ();
cnt (); // 0
cnt (); // 1
cnt (); // 2
cnt (); // 3
</script>
Saya menyimpan hasil eksekusi fungsi anonim (yaitu, menetapkan deklarasi subfungsi ke pemotongan variabel global) dalam memori
Saat mengeksekusi cut (), nilainya secara langsung diambil dari memori. Hanya fungsi CNT () yang dapat dipanggil, dan tidak mungkin untuk secara langsung mengingatkan (i)
Anda juga dapat mentransfer parameter ke penutupan
Salinan kode adalah sebagai berikut:
var cnt = (function (num) {
return function () {
peringatan (num);
num ++;
}
}) (5);
cnt (); // 5
cnt (); // 6
cnt (); // 7
// Tentu saja, Anda juga dapat melewati parameter saat menelepon
var cnt = (function () {
var i = 0;
return function (num) {
num+= i;
peringatan (num);
i ++;
}
}) ();
CNT (1); // 1
CNT (2); // 3
CNT (3); // 5
Untuk memiliki pemahaman yang lebih baik tentang penutupan, kami melihat kode berikut
Misalnya, saya ingin mengembalikan array dengan 5 fungsi dalam array, fungsi pertama muncul 0, dan yang kedua muncul 1 ...
Jika kode ditulis seperti ini
Salinan kode adalah sebagai berikut:
kotak fungsi () {
var arr = [];
untuk (i = 0; i <5; i ++) {
arr = function () {return i;}
}
return arr;
}
var a = box ();
peringatan (a); // array yang berisi lima badan fungsi
waspada (a [0] ());
waspada (a [1] ());
Tubuh fungsi pop-up
function () {return i;}}
Akhirnya, saya adalah 4, dan kemudian ++ menjadi 5
Untuk berhenti loop
Ditemukan bahwa semua muncul 5, yang jelas tidak memenuhi persyaratan kami
Solusi 1
PENERIMAAN SENDIRI FUNCTIONS DI DALAM
Salinan kode adalah sebagai berikut:
kotak fungsi () {
var arr = [];
untuk (i = 0; i <5; i ++) {
arr = (function (num) {return i;}) (i);
}
return arr;
}
var a = box ();
untuk (var i = 0; i <a.length; i ++) {
waspada (a);
}
Tetapi kami menemukan bahwa elemen -elemen dalam array yang dikembalikan adalah hasil dari eksekusi fungsi, tetapi yang kami inginkan adalah bahwa fungsi perlu ditingkatkan.
Solusi 2
Implementasi Penutupan
Salinan kode adalah sebagai berikut:
kotak fungsi () {
var arr = [];
untuk (var i = 0; i <5; i ++) {
arr = (function (num) {
return function () {return num;}
})(Saya);
}
return arr;
}
var arr = box ();
untuk (var i = 0; i <5; i ++) {
alert (arr ()); // 0,1,2,3,4
}
Kode kunci
Salinan kode adalah sebagai berikut:
arr = (function (num) {
return function () {return num;}
})(Saya);
Saat i = 0
arr [0] = (function (num) {return function () {return num;}}) (0);
Jam 1
arr [1] = (function (num) {return function () {return num;}}) (1);
Di atas adalah manfaat dari penutupan! Sangat sederhana dan praktis.