国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah hujung hadapan web html tutorial 淺談閉包機(jī)制

淺談閉包機(jī)制

Jul 11, 2016 am 08:44 AM

var foo = "Hello";
var c =(function a() {
function b(){
var bar = " World";
alert(foo + bar);
return bar;
}
return b;
})()();
alert(foo + c);
本實(shí)例彈出兩次hello world;
?
?
一、什么是閉包?
“官方”的解釋是:所謂“閉包”,指的是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。
相信很少有人能直接看懂這句話(huà),因?yàn)樗枋龅奶珜W(xué)術(shù)。我想用如何在Javascript中創(chuàng)建一個(gè)閉包來(lái)告訴你什么是閉包,因?yàn)樘^(guò)閉包的創(chuàng)建過(guò)程直接理解閉包的定義是非常困難的??聪旅孢@段代碼:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
這段代碼有兩個(gè)特點(diǎn):
1、函數(shù)b嵌套在函數(shù)a內(nèi)部;
2、函數(shù)a返回函數(shù)b。
這樣在執(zhí)行完var c=a()后,變量c實(shí)際上是指向了函數(shù)b,再執(zhí)行c()后就會(huì)彈出一個(gè)窗口顯示i的值(第一次為1)。這段代碼其實(shí)就創(chuàng)建了一個(gè)閉包,為什么?因?yàn)楹瘮?shù)a外的變量c引用了函數(shù)a內(nèi)的函數(shù)b,就是說(shuō):
?
當(dāng)函數(shù)a的內(nèi)部函數(shù)b被函數(shù)a外的一個(gè)變量引用的時(shí)候,就創(chuàng)建了一個(gè)閉包。
?
我猜想你一定還是不理解閉包,因?yàn)槟悴恢篱]包有什么作用,下面讓我們繼續(xù)探索。
?
二、閉包有什么作用?
簡(jiǎn)而言之,閉包的作用就是在a執(zhí)行完并返回后,閉包使得Javascript的垃圾回收機(jī)制GC不會(huì)收回a所占用的資源,因?yàn)閍的內(nèi)部函數(shù)b的執(zhí)行需要依賴(lài)a中的變量。這是對(duì)閉包作用的非常直白的描述,不專(zhuān)業(yè)也不嚴(yán)謹(jǐn),但大概意思就是這樣,理解閉包需要循序漸進(jìn)的過(guò)程。
在上面的例子中,由于閉包的存在使得函數(shù)a返回后,a中的i始終存在,這樣每次執(zhí)行c(),i都是自加1后alert出i的值。
?
那 么我們來(lái)想象另一種情況,如果a返回的不是函數(shù)b,情況就完全不同了。因?yàn)閍執(zhí)行完后,b沒(méi)有被返回給a的外界,只是被a所引用,而此時(shí)a也只會(huì)被b引 用,因此函數(shù)a和b互相引用但又不被外界打擾(被外界引用),函數(shù)a和b就會(huì)被GC回收。(關(guān)于Javascript的垃圾回收機(jī)制將在后面詳細(xì)介紹)
?
三、閉包內(nèi)的微觀世界
如 果要更加深入的了解閉包以及函數(shù)a和嵌套函數(shù)b的關(guān)系,我們需要引入另外幾個(gè)概念:函數(shù)的執(zhí)行環(huán)境(excution context)、活動(dòng)對(duì)象(call object)、作用域(scope)、作用域鏈(scope chain)。以函數(shù)a從定義到執(zhí)行的過(guò)程為例闡述這幾個(gè)概念。
?
1、當(dāng)定義函數(shù)a的時(shí)候,js解釋器會(huì)將函數(shù)a的作用域鏈(scope chain)設(shè)置為定義a時(shí)a所在的“環(huán)境”,如果a是一個(gè)全局函數(shù),則scope chain中只有window對(duì)象。
2、當(dāng)函數(shù)a執(zhí)行的時(shí)候,a會(huì)進(jìn)入相應(yīng)的執(zhí)行環(huán)境(excution context)。
3、在創(chuàng)建執(zhí)行環(huán)境的過(guò)程中,首先會(huì)為a添加一個(gè)scope屬性,即a的作用域,其值就為第1步中的scope chain。即a.scope=a的作用域鏈。
4、然后執(zhí)行環(huán)境會(huì)創(chuàng)建一個(gè)活動(dòng)對(duì)象(call object)?;顒?dòng)對(duì)象也是一個(gè)擁有屬性的對(duì)象,但它不具有原型而且不能通過(guò)JavaScript代碼直接訪問(wèn)。創(chuàng)建完活動(dòng)對(duì)象后,把活動(dòng)對(duì)象添加到a的作用域鏈的最頂端。此時(shí)a的作用域鏈包含了兩個(gè)對(duì)象:a的活動(dòng)對(duì)象和window對(duì)象。
5、下一步是在活動(dòng)對(duì)象上添加一個(gè)arguments屬性,它保存著調(diào)用函數(shù)a時(shí)所傳遞的參數(shù)。
6、最后把所有函數(shù)a的形參和內(nèi)部的函數(shù)b的引用也添加到a的活動(dòng)對(duì)象上。在這一步中,完成了函數(shù)b的的定義,因此如同第3步,函數(shù)b的作用域鏈被設(shè)置為b所被定義的環(huán)境,即a的作用域。
?
到此,整個(gè)函數(shù)a從定義到執(zhí)行的步驟就完成了。此時(shí)a返回函數(shù)b的引用給c,又函數(shù)b的作用域鏈包含了對(duì)函數(shù)a的活動(dòng)對(duì)象的引用,也就是說(shuō)b可以訪問(wèn)到a中定義的所有變量和函數(shù)。函數(shù)b被c引用,函數(shù)b又依賴(lài)函數(shù)a,因此函數(shù)a在返回后不會(huì)被GC回收。
?
當(dāng)函數(shù)b執(zhí)行的時(shí)候亦會(huì)像以上步驟一樣。因此,執(zhí)行時(shí)b的作用域鏈包含了3個(gè)對(duì)象:b的活動(dòng)對(duì)象、a的活動(dòng)對(duì)象和window對(duì)象,如下圖所示:
?
如圖所示,當(dāng)在函數(shù)b中訪問(wèn)一個(gè)變量的時(shí)候,搜索順序是先搜索自身的活動(dòng)對(duì)象,如果存在則返回,如果不存在將繼續(xù)搜索函數(shù)a的活動(dòng)對(duì)象,依 次查找,直到找到為止。如果整個(gè)作用域鏈上都無(wú)法找到,則返回undefined。如果函數(shù)b存在prototype原型對(duì)象,則在查找完自身的活動(dòng)對(duì)象 后先查找自身的原型對(duì)象,再繼續(xù)查找。這就是Javascript中的變量查找機(jī)制。
?
四、閉包的應(yīng)用場(chǎng)景
1、保護(hù)函數(shù)內(nèi)的變量安全。以最開(kāi)始的例子為例,函數(shù)a中i只有函數(shù)b才能訪問(wèn),而無(wú)法通過(guò)其他途徑訪問(wèn)到,因此保護(hù)了i的安全性。
2、在內(nèi)存中維持一個(gè)變量。依然如前例,由于閉包,函數(shù)a中i的一直存在于內(nèi)存中,因此每次執(zhí)行c(),都會(huì)給i自加1。
以上兩點(diǎn)是閉包最基本的應(yīng)用場(chǎng)景,很多經(jīng)典案例都源于此。
?
五、Javascript的垃圾回收機(jī)制
在Javascript中,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC回收。如果兩個(gè)對(duì)象互相引用,而不再被第3者所引用,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。因?yàn)楹瘮?shù)a被b引用,b又被a外的c引用,這就是為什么函數(shù)a執(zhí)行后不會(huì)被回收的原因。
Kenyataan Laman Web ini
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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

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.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Melaksanakan butang yang boleh diklik menggunakan elemen butang HTML Melaksanakan butang yang boleh diklik menggunakan elemen butang HTML Jul 07, 2025 am 02:31 AM

Untuk menggunakan elemen butang HTML untuk mencapai butang yang boleh diklik, anda mesti menguasai penggunaan asas dan langkah berjaga -jaga yang sama. 1. Buat butang dengan tag dan tentukan tingkah laku melalui atribut jenis (seperti butang, hantar, tetapkan semula), yang dikemukakan secara lalai; 2. Tambahkan fungsi interaktif melalui JavaScript, yang boleh ditulis dalam talian atau mengikat pendengar acara melalui ID untuk meningkatkan penyelenggaraan; 3. Gunakan CSS untuk menyesuaikan gaya, termasuk warna latar belakang, sempadan, sudut bulat dan kesan status hover/aktif untuk meningkatkan pengalaman pengguna; 4. Perhatikan masalah biasa: Pastikan atribut kurang upaya tidak didayakan, peristiwa JS terikat dengan betul, oklusi susun atur, dan gunakan bantuan alat pemaju untuk menyelesaikan masalah. Menguasai ini

Mengkonfigurasi metadata dokumen dalam elemen kepala HTML Mengkonfigurasi metadata dokumen dalam elemen kepala HTML Jul 09, 2025 am 02:30 AM

Metadata dalam htmlhead adalah penting untuk SEO, perkongsian sosial, dan tingkah laku penyemak imbas. 1. Tetapkan tajuk halaman dan perihalan, gunakan dan simpannya ringkas dan unik; 2. Tambahkan maklumat kad OpenGraph dan Twitter untuk mengoptimumkan kesan perkongsian sosial, perhatikan saiz imej dan gunakan alat penyahpepijatan untuk menguji; 3. Tentukan set aksara dan tetapan Viewport untuk memastikan sokongan pelbagai bahasa disesuaikan dengan terminal mudah alih; 4. Tag pilihan seperti Hak Cipta Pengarang, Kawalan Robot dan Canonical Mencegah Kandungan Duplikat juga harus dikonfigurasi dengan munasabah.

Tutorial HTML terbaik untuk pemula pada tahun 2025 Tutorial HTML terbaik untuk pemula pada tahun 2025 Jul 08, 2025 am 12:25 AM

Tolearnhtmlin2025, chooseatutorialthatalishands-onpracticeWithmodernstandardsandIntegrateScsSandjavascriptbasics.1.priorit izehands-onleleingwithstep-by-stepprojectslikeBuildingapersonalprofileorbloglayout.2.ensureitcoversmodernhtmlelementssuchas,

HTML untuk Tutorial Templat E -mel HTML untuk Tutorial Templat E -mel Jul 10, 2025 pm 02:01 PM

Bagaimana membuat templat mel html dengan keserasian yang baik? Pertama, anda perlu membina struktur dengan jadual untuk mengelakkan menggunakan susun atur div flex atau grid; Kedua, semua gaya mesti digariskan dan tidak boleh bergantung pada CSS luaran; Kemudian gambar harus ditambah dengan keterangan alt dan menggunakan URL awam, dan butang harus disimulasikan dengan jadual atau TD dengan warna latar belakang; Akhirnya, anda mesti menguji dan menyesuaikan butiran mengenai pelbagai pelanggan.

Bagaimana untuk mengaitkan kapsyen dengan imej atau media menggunakan angka HTML dan elemen figcaption? Bagaimana untuk mengaitkan kapsyen dengan imej atau media menggunakan angka HTML dan elemen figcaption? Jul 07, 2025 am 02:30 AM

Menggunakan jumlah HTML membolehkan kejelasan intuitif dan semantik untuk menambah teks kapsyen ke imej atau media. 1. Digunakan untuk membungkus kandungan media bebas, seperti gambar, video atau blok kod; 2. Ia diletakkan sebagai teks penjelasannya, dan boleh terletak di atas atau di bawah media; 3. Mereka bukan sahaja meningkatkan kejelasan struktur halaman, tetapi juga meningkatkan akses dan kesan SEO; 4. Apabila menggunakannya, anda harus memberi perhatian untuk mengelakkan penyalahgunaan, dan memohon kepada kandungan yang perlu ditekankan dan disertai dengan keterangan, bukannya gambar hiasan biasa; 5. Atribut alt yang tidak boleh diabaikan, yang berbeza dari figcaption; 6. Figcaption adalah fleksibel dan boleh diletakkan di bahagian atas atau bawah angka seperti yang diperlukan. Menggunakan kedua -dua tag ini dengan betul membantu membina semantik dan mudah difahami kandungan web.

Bagaimana Mengatasi Penyerahan Borang Di HTML Tanpa Pelayan? Bagaimana Mengatasi Penyerahan Borang Di HTML Tanpa Pelayan? Jul 09, 2025 am 01:14 AM

Apabila tiada pelayan backend, penyerahan borang HTML masih boleh diproses melalui teknologi front-end atau perkhidmatan pihak ketiga. Kaedah khusus termasuk: 1. Gunakan JavaScript untuk memintas penyerahan bentuk untuk mencapai pengesahan input dan maklum balas pengguna, tetapi data tidak akan berterusan; 2. Gunakan perkhidmatan bentuk tanpa pelayan pihak ketiga seperti FormSpree untuk mengumpul data dan memberikan pemberitahuan e-mel dan fungsi semula; 3. Gunakan LocalStorage untuk menyimpan data klien sementara, yang sesuai untuk menyimpan keutamaan pengguna atau menguruskan status aplikasi tunggal halaman, tetapi tidak sesuai untuk penyimpanan jangka panjang maklumat sensitif.

Apakah atribut global yang paling biasa digunakan dalam HTML? Apakah atribut global yang paling biasa digunakan dalam HTML? Jul 10, 2025 am 10:58 AM

Kelas, ID, Gaya, Data, dan Tajuk adalah atribut global yang paling biasa digunakan dalam HTML. Kelas digunakan untuk menentukan satu atau lebih nama kelas untuk memudahkan tetapan gaya dan operasi JavaScript; ID menyediakan pengenal unik untuk elemen, sesuai untuk lompatan sauh dan kawalan JavaScript; Gaya membolehkan gaya sebaris ditambah, sesuai untuk debugging sementara tetapi tidak disyorkan untuk kegunaan besar-besaran; sifat data digunakan untuk menyimpan data tersuai, yang mudah untuk interaksi front-end dan back-end; Tajuk digunakan untuk menambah arahan tetikus, tetapi gaya dan kelakuannya terhad oleh penyemak imbas. Pemilihan yang munasabah sifat -sifat ini dapat meningkatkan kecekapan pembangunan dan pengalaman pengguna.

Melaksanakan pemuatan malas asli untuk imej dalam html Melaksanakan pemuatan malas asli untuk imej dalam html Jul 12, 2025 am 12:48 AM

Pemuatan malas asli adalah fungsi penyemak imbas terbina dalam yang membolehkan pemuatan gambar malas dengan menambah atribut pemuatan = "malas" ke tag. 1. Ia tidak memerlukan JavaScript atau perpustakaan pihak ketiga, dan digunakan secara langsung dalam HTML; 2. Ia sesuai untuk gambar yang tidak dipaparkan pada skrin pertama di bawah halaman, galeri gambar menatal tambahan dan sumber gambar yang besar; 3. Ia tidak sesuai untuk gambar dengan skrin pertama atau paparan: Tiada; 4. Apabila menggunakannya, pemegang tempat yang sesuai harus ditetapkan untuk mengelakkan susun atur susun atur; 5. Ia harus mengoptimumkan pemuatan imej responsif dalam kombinasi dengan atribut srcset dan saiz; 6. Isu keserasian perlu dipertimbangkan. Sesetengah pelayar lama tidak menyokongnya. Mereka boleh digunakan melalui pengesanan ciri dan digabungkan dengan penyelesaian JavaScript.

See all articles