cari
Rumahhujung hadapan webtutorial jsAsas JavaScript (6) Penutupan Ungkapan Fungsi_Kemahiran Javascript

Sebenarnya, sebab utama js menyokong penutupan fungsi adalah kerana js memerlukan fungsi untuk dapat menyimpan data. Data yang disimpan di sini ialah hanya nilai pembolehubah dalam fungsi akan disimpan selepas fungsi tamat. Mengenai mengapa js perlu dapat menyimpan data dalam fungsi, iaitu js ialah bahasa berfungsi. Menyimpan data dalam fungsi adalah ciri khas bahasa berfungsi.

Semak semula tiga kaedah mentakrifkan fungsi yang diperkenalkan sebelum ini

functiosu(numnumreturnunum//Takrifan sintaks pengisytiharan fungsi
vasufunction(numnum)returnunum}//Takrif ungkapan fungsi
vasuneFunction("num""num""returnunum")//Functio constructor

Sebelum menganalisis penutupan, mari kita lihat dahulu kesilapan biasa dalam mentakrif dan memanggil fungsi.

Contoh 1:

sayHi(); //错误:函数还不存在
var sayHi = function () {
  alert("test");
};

Contoh 2:

if (true) {
  function sayHi() {
    alert("1");
  }
} else {
  function sayHi() {
    alert("2");
  }
}
sayHi();//打印结果并不是我们想要的

Contoh 3:

var fun1 = function fun2() {
  alert("test");
}
fun2();//错误:函数还不存在

Dalam Contoh 1, kita tidak boleh memanggil fungsi sebelum mentakrifkannya menggunakan sintaks deklaratif fungsi. Penyelesaian:

1 Jika anda menggunakan ungkapan fungsi untuk mentakrifkan fungsi, ia perlu dipanggil selepas ungkapan itu ditakrifkan.

var sayHi = function () {
  alert("test");
};
sayHi()

2. Gunakan pengisytiharan fungsi. (Di sini enjin penyemak imbas akan mempromosikan pengisytiharan fungsi dan membaca pengisytiharan fungsi sebelum semua kod dilaksanakan)

sayHi(); 
function sayHi () {
  alert("test");
};

Dalam Contoh 2, hasil jangkaan kami sepatutnya mencetak 1, tetapi hasil sebenar ialah mencetak 2.

if (true) {
  function sayHi() {
   alert("1");
  }
  } else {
  function sayHi() {
   alert("2");
  }
}
sayHi();//打印结果并不是我们想要的

Mengapa ini berlaku? Kerana promosi pengisytiharan fungsi, penyemak imbas tidak akan menilai keadaan if semasa pra-penghuraian, dan secara langsung menimpa yang pertama apabila menghuraikan definisi fungsi kedua.

Penyelesaian:

var sayHi;
if (true) {
  sayHi = function () {
   alert("1");
  }
  } else {
  sayHi = function () {
   alert("2");
  }
}
sayHi();

Dalam Contoh 3, kami mendapati bahawa kami hanya boleh menggunakan fun1() untuk memanggil, tetapi bukan fun2().

Dari pemahaman saya sendiri, saya tidak tahu sebab sebenar. Tiada maklumat ditemui.

Kerana 1: function fun3() { }; adalah bersamaan dengan var fun3 = function fun3() { };

Jadi anda hanya boleh menggunakan fun1() untuk memanggil, tetapi bukan fun2().

Sebenarnya, saya masih ada soalan di sini? Jika sesiapa tahu, sila beritahu saya.

Memandangkan fun2 tidak boleh dipanggil dari luar, mengapa ia boleh dipanggil dari dalam fungsi? Walaupun saya masih tidak boleh mendapatkan fun1 dalam penyahpepijat.

Baiklah, mari kita hangat dengan tiga soalan di atas. Mari kita teruskan dengan topik "penutupan" hari ini.

1. Apakah itu penutupan?

Definisi: Ia ialah fungsi yang mempunyai akses kepada pembolehubah dalam skop fungsi lain

Mari mulakan dengan fungsi contoh:

Contoh 1:

function fun() {
  var a = "张三";
}
fun();//在我们执行完后,变量a就被标记为销毁了
Contoh 2:

function fun() {
  var a = "张三";
  return function () {
    alert("test");
  }
}
var f = fun();//同样,在我们执行完后,变量a就被标记为销毁了
Contoh 3:

function fun() {
  var a = "张三";
  return function () {
    alert(a);
  }
}
var f = fun();//【现在情况发生变化了,如果a被销毁,显然f被调用的话就不能访问到变量a的值了】
f();//【然后变量a的值正常的被访问到了】
//这就是闭包,当函数A 返回的函数B 里面使用到了函数A的变量,那么函数B就使用了闭包。
示例:
function fun() {
  var a = "张三";
  return function () {
   alert(a);
  }
}
var f = fun();//【现在情况发生变化了,如果a被销毁,显然f被调用的话就不能访问到变量a的值了】
f();//【然后变量a的值正常的被访问到了】
Jelas sekali, penyalahgunaan penutupan akan meningkatkan penggunaan memori. Oleh itu, cuba untuk tidak menggunakan penutupan melainkan terdapat keadaan khusus. Jika digunakan, ingat untuk menetapkan rujukan null secara manual supaya memori boleh dikitar semula f = null ;

Ilustrasi: (Pelajar yang tidak memahami rantaian skop, sila baca artikel sebelum ini Skop dan Rantaian Skop dahulu)

2. Apakah fungsi tanpa nama? (Sekadar menerangkan konsep)

Contohnya: (iaitu fungsi tanpa nama)

Mengenai fenomena aneh ini apabila nilai pulangan fungsi dalam objek ialah fungsi tanpa nama

Sebelum menerangkan, sila bersihkan kepala anda dahulu dan jangan bertambah keliru semasa anda membaca. Jika anda keliru, abaikan sahaja perkara berikut.

var name1 = "张三";
var obj = {
  name1: "李四",      
  fun2: function () {
    alert(this.name1);
  },
  fun3: function () {
    return function () {
      alert(this.name1);
    }
  }
}
obj.fun2();//Hasil cetakan "李思" adalah seperti yang dijangkakan.
obj.fun3()();//Oleh kerana apa yang dikembalikan di sini ialah fungsi, kita perlu menambah sepasang () untuk memanggilnya. Hasil cetakan ialah "Zhang San", yang tidak dijangka.

//Ia benar-benar mengelirukan. Apakah maksud ini kepada keadaan keseluruhan?
Kami berkata sebelum ini bahawa "mana-mana objek yang mengklik kaedah, ini ialah objek", kemudian obj.fun3()() kami mencetak "Zhang San", yang bermaksud ini melaksanakan skop global.

Kita mungkin faham sebabnya dengan melihat contoh di bawah.

Mari menguraikan obj.fun3()(). Mula-mula, obj.fun3() mengembalikan fungsi tanpa nama kepada skop tetingkap, dan kemudian memanggilnya untuk menunjuk ke tetingkap. (Saya rasa penjelasannya agak terpaksa, dan saya tidak tahu sama ada betul atau tidak. Beginilah cara saya memahaminya buat masa ini)

Punca pembentukan penutupan: masalah pelepasan ingatan

Secara amnya, apabila fungsi itu dilaksanakan, objek aktif tempatan akan dimusnahkan, dan hanya skop global disimpan dalam ingatan, tetapi situasi dengan penutupan adalah berbeza.

Objek aktif penutupan masih akan disimpan dalam ingatan, jadi dalam contoh di atas, selepas panggilan fungsi kembali, pembolehubah i tergolong dalam objek aktif, yang bermaksud kawasan tindanannya belum dikeluarkan, tetapi anda memanggil c() Apabila rantaian skop yang disimpan oleh pembolehubah i pergi dari b()->a()-> ; hasil dalam penutupan, dan akhirnya Nilai output ialah 2;

Di atas ialah penutupan ungkapan fungsi dalam Asas JavaScript Bahagian 6 yang dikongsi oleh editor dengan anda.

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
JavaScript dan Web: Fungsi teras dan kes penggunaanJavaScript dan Web: Fungsi teras dan kes penggunaanApr 18, 2025 am 12:19 AM

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Memahami Enjin JavaScript: Butiran PelaksanaanMemahami Enjin JavaScript: Butiran PelaksanaanApr 17, 2025 am 12:05 AM

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python vs JavaScript: Keluk Pembelajaran dan Kemudahan PenggunaanPython vs JavaScript: Keluk Pembelajaran dan Kemudahan PenggunaanApr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Python vs JavaScript: Komuniti, Perpustakaan, dan SumberPython vs JavaScript: Komuniti, Perpustakaan, dan SumberApr 15, 2025 am 12:16 AM

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Dari C/C ke JavaScript: Bagaimana semuanya berfungsiDari C/C ke JavaScript: Bagaimana semuanya berfungsiApr 14, 2025 am 12:05 AM

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript: Membandingkan PelaksanaanEnjin JavaScript: Membandingkan PelaksanaanApr 13, 2025 am 12:05 AM

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Apr 11, 2025 am 08:23 AM

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)