Fahami penutupan js dalam satu minit_javascript kemahiran
Apakah itu penutupan?
Lihat sekeping kod dahulu:
function a(){ var n = 0; function inc() { n++; console.log(n); } inc(); inc(); } a(); //控制台输出1,再输出2
Pastikan ia mudah. Mari lihat sekeping kod sekali lagi:
function a(){ var n = 0; this.inc = function () { n++; console.log(n); }; } var c = new a(); c.inc(); //控制台输出1 c.inc(); //控制台输出2
Pastikan ia mudah.
Apakah itu penutupan? Ini adalah penutupan!
Fungsi yang mempunyai akses kepada pembolehubah dalam skop fungsi lain ialah penutupan. Di sini fungsi inc mengakses pembolehubah n dalam pembina a, jadi penutupan terbentuk.
Lihat sekeping kod sekali lagi:
function a(){ var n = 0; function inc(){ n++; console.log(n); } return inc; } var c = a(); c(); //控制台输出1 c(); //控制台输出2
Lihat cara ia berfungsi:
var c = couter(), ayat ini couter() mengembalikan fungsi inc, maka ayat ini bersamaan dengan var c = inc;
c(), ayat ini bersamaan dengan inc(); Perhatikan bahawa , nama fungsi hanyalah pengecam (penunjuk kepada fungsi), dan () ialah fungsi pelaksanaan.
Terjemahan bagi tiga ayat seterusnya ialah: var c = inc();, adakah ia berbeza daripada kod pertama? Tidak.
Apakah itu penutupan? Ini adalah penutupan!
Semua tutorial buku teks suka menggunakan perenggan terakhir untuk menerangkan penutupan, tetapi saya fikir ini merumitkan masalah. Apa yang dikembalikan di sini ialah nama fungsi Pelajar yang belum melihat pengaturcaraan C/C++ Tan Haoqiang mungkin tidak segera menyedari perbezaan antara menggunakan () dengan kata lain, kaedah penulisan ini mempunyai perangkapnya sendiri. Walaupun cara penulisan ini lebih elegan, saya masih suka memudahkan masalah Lihat kod 1 dan kod 2. Adakah anda masih keliru tentang panggilan fungsi Adakah anda keliru tentang nilai n?
Mengapa anda menulisnya seperti ini?
Kami tahu bahawa setiap fungsi js adalah bilik gelap kecil Ia boleh mendapatkan maklumat dari dunia luar, tetapi dunia luar tidak dapat melihat secara langsung kandungan di dalamnya. Masukkan pembolehubah n ke dalam bilik hitam kecil Kecuali untuk fungsi inc, tiada cara lain untuk mengakses pembolehubah n Selain itu, mentakrifkan pembolehubah n dengan nama yang sama di luar fungsi a tidak mempengaruhi satu sama lain "enkapsulasi" .
Sebab pulangan digunakan untuk mengembalikan inc pengecam fungsi adalah kerana fungsi inc tidak boleh dipanggil terus di luar fungsi, jadi return inc dipautkan ke bahagian luar. Ini dalam kod 2 juga memautkan inc ke luar.
Perangkap Biasa
Lihat ini:
function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } var funcs = createFunctions(); for (var i=0; i < funcs.length; i++){ console.log(funcs[i]()); }
Pada pandangan pertama, saya fikir ia akan mengeluarkan 0~9, tetapi saya tidak pernah fikir ia akan mengeluarkan 10 10s?
Perangkap di sini ialah: Fungsi dengan () ialah fungsi pelaksanaan! Ayat mudah seperti var f = function() { alert('Hi' }); dilaksanakan. Terjemahan kod di atas ialah:
var result = new Array(), i; result[0] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换! result[1] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换! ... result[9] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换! i = 10; funcs = result; result = null; console.log(i); // funcs[0]()就是执行 return i 语句,就是返回10 console.log(i); // funcs[1]()就是执行 return i 语句,就是返回10 ... console.log(i); // funcs[9]()就是执行 return i 语句,就是返回10
Mengapa hanya hasil yang dikumpul tetapi tidak saya? Kerana saya masih dirujuk oleh fungsi. Seperti restoran, pinggan sentiasa terhad, jadi pelayan akan meronda di meja untuk mengambil pinggan kosong, tetapi beranikah dia mengutip pinggan yang masih mengandungi sayur? Sudah tentu, jika anda mengosongkan hidangan secara manual di atas pinggan (=null), pinggan itu akan dibawa pergi Ini adalah mekanisme kitar semula memori.
Mengenai bagaimana nilai i masih boleh dikekalkan, sebenarnya, selepas membaca sepanjang jalan dari awal artikel, tiada apa yang perlu dirisaukan. Bukankah sekeping makanan di atas pinggan sepatutnya hilang selepas makan sekeping?
Untuk meringkaskan
Penutupan ialah fungsi yang merujuk kepada pembolehubah fungsi lain Kerana pembolehubah dirujuk, ia tidak akan dikitar semula, jadi ia boleh digunakan untuk merangkum pembolehubah persendirian. Ini adalah kelebihan dan kekurangan Penutupan yang tidak perlu hanya akan meningkatkan penggunaan memori! Selain itu, apabila menggunakan penutupan, anda juga harus memberi perhatian kepada sama ada nilai pembolehubah memenuhi keperluan anda, kerana ia seperti pembolehubah peribadi statik. Penutupan biasanya bercampur dengan banyak perkara Hanya dengan menghubungi mereka anda boleh mendalami pemahaman anda Di sini hanyalah permulaan untuk bercakap tentang perkara asas.
Pautan ke artikel ini: http://www.cnblogs.com/qieguo/p/5457040.html
Di atas adalah keseluruhan kandungan artikel ini, saya harap ia akan membantu kajian semua orang.

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Teknologi pengesanan dan pengecaman muka adalah teknologi yang agak matang dan digunakan secara meluas. Pada masa ini, bahasa aplikasi Internet yang paling banyak digunakan ialah JS Melaksanakan pengesanan muka dan pengecaman pada bahagian hadapan Web mempunyai kelebihan dan kekurangan berbanding dengan pengecaman muka bahagian belakang. Kelebihan termasuk mengurangkan interaksi rangkaian dan pengecaman masa nyata, yang sangat memendekkan masa menunggu pengguna dan meningkatkan pengalaman pengguna termasuk: terhad oleh saiz model, ketepatannya juga terhad. Bagaimana untuk menggunakan js untuk melaksanakan pengesanan muka di web? Untuk melaksanakan pengecaman muka di Web, anda perlu biasa dengan bahasa dan teknologi pengaturcaraan yang berkaitan, seperti JavaScript, HTML, CSS, WebRTC, dll. Pada masa yang sama, anda juga perlu menguasai visi komputer yang berkaitan dan teknologi kecerdasan buatan. Perlu diingat bahawa kerana reka bentuk bahagian Web

Dalam C++, penutupan ialah ungkapan lambda yang boleh mengakses pembolehubah luaran. Untuk membuat penutupan, tangkap pembolehubah luar dalam ungkapan lambda. Penutupan memberikan kelebihan seperti kebolehgunaan semula, penyembunyian maklumat dan penilaian malas. Ia berguna dalam situasi dunia sebenar seperti pengendali acara, di mana penutupan masih boleh mengakses pembolehubah luar walaupun ia dimusnahkan.

Ungkapan C++ Lambda menyokong penutupan, yang menyimpan pembolehubah skop fungsi dan menjadikannya boleh diakses oleh fungsi. Sintaks ialah [capture-list](parameters)->return-type{function-body}. capture-list mentakrifkan pembolehubah untuk ditangkap Anda boleh menggunakan [=] untuk menangkap semua pembolehubah tempatan mengikut nilai, [&] untuk menangkap semua pembolehubah tempatan melalui rujukan, atau [variable1, variable2,...] untuk menangkap pembolehubah tertentu. Ungkapan Lambda hanya boleh mengakses pembolehubah yang ditangkap tetapi tidak boleh mengubah suai nilai asal.

Penutupan ialah fungsi bersarang yang boleh mengakses pembolehubah dalam skop fungsi luar Kelebihannya termasuk pengkapsulan data, pengekalan keadaan dan fleksibiliti. Kelemahan termasuk penggunaan memori, kesan prestasi dan kerumitan penyahpepijatan. Selain itu, penutupan boleh mencipta fungsi tanpa nama dan menyerahkannya kepada fungsi lain sebagai panggilan balik atau hujah.

Tajuk: Kebocoran memori disebabkan oleh penutupan dan penyelesaian Pengenalan: Penutupan ialah konsep yang sangat biasa dalam JavaScript, yang membenarkan fungsi dalaman mengakses pembolehubah fungsi luaran. Walau bagaimanapun, penutupan boleh menyebabkan kebocoran memori jika digunakan secara tidak betul. Artikel ini akan meneroka masalah kebocoran memori yang disebabkan oleh penutupan dan menyediakan penyelesaian serta contoh kod khusus. 1. Kebocoran memori disebabkan oleh penutupan Ciri penutupan ialah fungsi dalaman boleh mengakses pembolehubah fungsi luaran, yang bermaksud pembolehubah yang dirujuk dalam penutupan tidak akan dikumpul sampah. Jika digunakan secara tidak betul,

Kesan penunjuk fungsi dan penutupan pada prestasi Go adalah seperti berikut: Penunjuk fungsi: Lebih perlahan sedikit daripada panggilan langsung, tetapi meningkatkan kebolehbacaan dan kebolehgunaan semula. Penutupan: Biasanya lebih perlahan, tetapi merangkumi data dan tingkah laku. Kes praktikal: Penunjuk fungsi boleh mengoptimumkan algoritma pengisihan dan penutupan boleh mencipta pengendali acara, tetapi ia akan membawa kerugian prestasi.

Hubungan antara js dan vue: 1. JS sebagai asas pembangunan Web; 2. Kebangkitan Vue.js sebagai rangka kerja hadapan 3. Hubungan pelengkap antara JS dan Vue; Vue.

Penutupan dalam Java membenarkan fungsi dalaman mengakses pembolehubah skop luar walaupun fungsi luar telah keluar. Dilaksanakan melalui kelas dalaman tanpa nama, kelas dalam memegang rujukan kepada kelas luar dan memastikan pembolehubah luar aktif. Penutupan meningkatkan fleksibiliti kod, tetapi anda perlu sedar tentang risiko kebocoran memori kerana rujukan kepada pembolehubah luaran oleh kelas dalaman tanpa nama memastikan pembolehubah tersebut hidup.
