Apa itu penutupan?
Mari kita lihat sepotong kode terlebih dahulu:
fungsi a () {var n = 0; fungsi inc () {n ++; console.log (n); } inc (); Inc (); }A(); // output konsol 1, lalu output 2Itu sederhana. Mari kita lihat sepotong kode lain:
fungsi a () {var n = 0; this.inc = function () {n ++; console.log (n); };} var c = new a (); c.inc (); // output konsol 1c.inc (); // Output Konsol 2Itu sederhana.
Apa itu penutupan? Ini adalah penutupan!
Fungsi yang memiliki akses ke variabel dalam ruang lingkup fungsi lain adalah penutupan. Di sini fungsi INC mengakses variabel N dalam konstruktor A, sehingga penutupan terbentuk.
Mari kita lihat sepotong kode lain:
fungsi a () {var n = 0; fungsi inc () {n ++; console.log (n); } return inc;} var c = a (); c (); // output konsol 1c (); // Output Konsol 2Mari kita lihat bagaimana itu dieksekusi:
var c = coUter (), kalimat ini () mengembalikan fungsi inc, maka kalimat ini setara dengan var c = inc;
C (), kalimat ini setara dengan Inc (); Perhatikan bahwa nama fungsi hanyalah pengidentifikasi (pointer ke fungsi), dan () adalah fungsi eksekusi.
Tiga kalimat berikutnya diterjemahkan ke dalam: var c = inc; Inc (); Inc ();, apakah ada perbedaan antara itu dan potongan kode pertama? TIDAK.
Apa itu penutupan? Ini adalah penutupan!
Semua tutorial buku teks suka menggunakan paragraf terakhir untuk menggambarkan penutupan, tapi saya pikir ini memperumit masalahnya. Apa yang dikembalikan di sini adalah nama fungsi. Siswa yang belum pernah melihat pemrograman C/C ++ Tan Haoqiang mungkin tidak segera mencerminkan perbedaan antara membawa () atau tidak, yang berarti bahwa metode penulisan ini dilengkapi dengan perangkap. Meskipun metode penulisan ini lebih menonjol, saya masih suka menyampaikan masalah dan melihat kode 1 dan kode 2. Anda masih akan bingung tentang panggilan fungsi, apakah Anda akan bingung tentang nilai n?
Mengapa Anda perlu menulis seperti ini?
Kita tahu bahwa setiap fungsi JS adalah kamar hitam kecil. Ini dapat memperoleh informasi eksternal, tetapi dunia luar tidak dapat secara langsung melihat konten di dalamnya. Menempatkan variabel n ke ruangan gelap kecil, kecuali untuk fungsi INC, tidak ada cara lain untuk menghubungi variabel n. Selain itu, mendefinisikan variabel n dengan nama yang sama di luar fungsi A tidak saling mempengaruhi. Ini adalah peningkatan "enkapsulasi".
Alasan mengapa Anda perlu menggunakan fungsi pengembalian kembali untuk mengidentifikasi INC adalah karena fungsi INC tidak dapat dipanggil langsung di luar fungsi A, jadi Return Inc dikaitkan dengan luar. Ini dalam kode 2 juga hanya Associates Inc dengan luar.
Perangkap umum
Lihat ini:
fungsi createFunctions () {var result = array baru (); untuk (var i = 0; i <10; i ++) {result [i] = function () {return i; }; } return hasil;} var funcs = createFunctions (); untuk (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}Sekilas, saya pikir itu menghasilkan 0 ~ 9, tapi saya tidak pernah berharap itu menghasilkan 10 10?
Perangkap di sini adalah: fungsi dengan () adalah fungsi eksekusi! Kalimat sederhana var f = function () {alert ('hai'); }; tidak akan muncul, dan kalimat berikut f (); akan menjalankan kode di dalam fungsi. Kode di atas diterjemahkan sebagai:
var result = array baru (), i; hasil [0] = function () {return i; }; // Fungsinya tidak dieksekusi, fungsi tetap tidak berubah, dan i dalam fungsi tidak dapat diganti! Hasil [1] = function () {return i; }; // Fungsinya tidak dieksekusi, fungsi tetap tidak berubah, dan i dalam fungsi tidak dapat diganti! ... hasil [9] = function () {return i; }; // Fungsinya tidak dieksekusi, fungsi tetap tidak berubah, dan i dalam fungsi tidak dapat diganti! i = 10; funcs = hasil; hasil = null; console.log (i); // funcs [0] () adalah untuk mengeksekusi pernyataan pengembalian I, yaitu mengembalikan 10console.log (i); // funcs [1] () adalah untuk mengeksekusi pernyataan pengembalian I, yaitu mengembalikan 10 ... console.log (i); // funcs [9] () adalah untuk mengeksekusi pernyataan return i, yaitu pengembalian 10Mengapa hanya hasil pengumpulan sampah tetapi bukan saya? Karena saya masih dirujuk oleh fungsi. Ini seperti restoran di mana piring selalu terbatas, jadi pelayan akan pergi ke patroli Taiwan untuk mendaur ulang piring kosong, tetapi beraninya dia mengumpulkan piring yang masih mengandung sayuran? Tentu saja, jika Anda menuangkan hidangan secara manual (= nol) di piring sendiri, piring akan diambil. Ini adalah apa yang disebut mekanisme daur ulang memori.
Adapun bagaimana nilai saya masih bisa dipertahankan, pada kenyataannya, membacanya sepanjang jalan dari awal artikel seharusnya tidak ada yang perlu dikhawatirkan. Bukankah perlu makan sepotong hidangan di atas piring untuk kehilangan satu potong?
Mari kita ringkas
Penutupan adalah variabel bahwa fungsi mengacu pada fungsi lain. Karena variabel dirujuk, itu tidak akan didaur ulang, sehingga dapat digunakan untuk merangkum variabel pribadi. Ini adalah keuntungan dan kerugian. Penutupan yang tidak perlu hanya akan meningkatkan konsumsi memori! Selain itu, saat menggunakan penutupan, Anda juga harus memperhatikan apakah nilai variabel memenuhi persyaratan Anda, karena itu seperti variabel pribadi statis. Penutupan biasanya bercampur dengan banyak hal, dan hanya setelah menghubungi mereka dengan lebih banyak pemahaman, dapatkah kita memperdalam pemahaman kita. Di sini kita hanya berbicara tentang hal -hal dasar.
Tautan ke artikel ini: http://www.cnblogs.com/qieguo/p/5457040.html
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.