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

首頁 web前端 html教學 淺談閉包機制

淺談閉包機制

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);
本實例彈出兩次hello world;
?
?
一、什么是閉包?
“官方”的解釋是:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
相信很少有人能直接看懂這句話,因為他描述的太學術。我想用如何在Javascript中創(chuàng)建一個閉包來告訴你什么是閉包,因為跳過閉包的創(chuàng)建過程直接理解閉包的定義是非常困難的??聪旅孢@段代碼:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
這段代碼有兩個特點:
1、函數b嵌套在函數a內部;
2、函數a返回函數b。
這樣在執(zhí)行完var c=a()后,變量c實際上是指向了函數b,再執(zhí)行c()后就會彈出一個窗口顯示i的值(第一次為1)。這段代碼其實就創(chuàng)建了一個閉包,為什么?因為函數a外的變量c引用了函數a內的函數b,就是說:
?
當函數a的內部函數b被函數a外的一個變量引用的時候,就創(chuàng)建了一個閉包。
?
我猜想你一定還是不理解閉包,因為你不知道閉包有什么作用,下面讓我們繼續(xù)探索。
?
二、閉包有什么作用?
簡而言之,閉包的作用就是在a執(zhí)行完并返回后,閉包使得Javascript的垃圾回收機制GC不會收回a所占用的資源,因為a的內部函數b的執(zhí)行需要依賴a中的變量。這是對閉包作用的非常直白的描述,不專業(yè)也不嚴謹,但大概意思就是這樣,理解閉包需要循序漸進的過程。
在上面的例子中,由于閉包的存在使得函數a返回后,a中的i始終存在,這樣每次執(zhí)行c(),i都是自加1后alert出i的值。
?
那 么我們來想象另一種情況,如果a返回的不是函數b,情況就完全不同了。因為a執(zhí)行完后,b沒有被返回給a的外界,只是被a所引用,而此時a也只會被b引 用,因此函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。(關于Javascript的垃圾回收機制將在后面詳細介紹)
?
三、閉包內的微觀世界
如 果要更加深入的了解閉包以及函數a和嵌套函數b的關系,我們需要引入另外幾個概念:函數的執(zhí)行環(huán)境(excution context)、活動對象(call object)、作用域(scope)、作用域鏈(scope chain)。以函數a從定義到執(zhí)行的過程為例闡述這幾個概念。
?
1、當定義函數a的時候,js解釋器會將函數a的作用域鏈(scope chain)設置為定義a時a所在的“環(huán)境”,如果a是一個全局函數,則scope chain中只有window對象。
2、當函數a執(zhí)行的時候,a會進入相應的執(zhí)行環(huán)境(excution context)。
3、在創(chuàng)建執(zhí)行環(huán)境的過程中,首先會為a添加一個scope屬性,即a的作用域,其值就為第1步中的scope chain。即a.scope=a的作用域鏈。
4、然后執(zhí)行環(huán)境會創(chuàng)建一個活動對象(call object)?;顒訉ο笠彩且粋€擁有屬性的對象,但它不具有原型而且不能通過JavaScript代碼直接訪問。創(chuàng)建完活動對象后,把活動對象添加到a的作用域鏈的最頂端。此時a的作用域鏈包含了兩個對象:a的活動對象和window對象。
5、下一步是在活動對象上添加一個arguments屬性,它保存著調用函數a時所傳遞的參數。
6、最后把所有函數a的形參和內部的函數b的引用也添加到a的活動對象上。在這一步中,完成了函數b的的定義,因此如同第3步,函數b的作用域鏈被設置為b所被定義的環(huán)境,即a的作用域。
?
到此,整個函數a從定義到執(zhí)行的步驟就完成了。此時a返回函數b的引用給c,又函數b的作用域鏈包含了對函數a的活動對象的引用,也就是說b可以訪問到a中定義的所有變量和函數。函數b被c引用,函數b又依賴函數a,因此函數a在返回后不會被GC回收。
?
當函數b執(zhí)行的時候亦會像以上步驟一樣。因此,執(zhí)行時b的作用域鏈包含了3個對象:b的活動對象、a的活動對象和window對象,如下圖所示:
?
如圖所示,當在函數b中訪問一個變量的時候,搜索順序是先搜索自身的活動對象,如果存在則返回,如果不存在將繼續(xù)搜索函數a的活動對象,依 次查找,直到找到為止。如果整個作用域鏈上都無法找到,則返回undefined。如果函數b存在prototype原型對象,則在查找完自身的活動對象 后先查找自身的原型對象,再繼續(xù)查找。這就是Javascript中的變量查找機制。
?
四、閉包的應用場景
1、保護函數內的變量安全。以最開始的例子為例,函數a中i只有函數b才能訪問,而無法通過其他途徑訪問到,因此保護了i的安全性。
2、在內存中維持一個變量。依然如前例,由于閉包,函數a中i的一直存在于內存中,因此每次執(zhí)行c(),都會給i自加1。
以上兩點是閉包最基本的應用場景,很多經典案例都源于此。
?
五、Javascript的垃圾回收機制
在Javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收。如果兩個對象互相引用,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收。因為函數a被b引用,b又被a外的c引用,這就是為什么函數a執(zhí)行后不會被回收的原因。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

我如何了解最新的HTML標準和最佳實踐? 我如何了解最新的HTML標準和最佳實踐? Jun 20, 2025 am 08:33 AM

要跟上HTML標準和最佳實踐,關鍵在於有意為之而非盲目追隨。首先,關注官方來源如WHATWG和W3C的摘要或更新日誌,了解新標籤(如)和屬性,將其作為參考解決疑難問題;其次,訂閱可信的網頁開發(fā)新聞通訊和博客,每週花10-15分鐘瀏覽更新,關注實際用例而非僅收藏文章;再次,使用開發(fā)者工具和linters如HTMLHint,通過即時反饋優(yōu)化代碼結構;最後,與開發(fā)者社區(qū)互動,分享經驗並學習他人實戰(zhàn)技巧,從而持續(xù)提升HTML技能。

如何使用元素來表示文檔的主要內容? 如何使用元素來表示文檔的主要內容? Jun 19, 2025 pm 11:09 PM

使用標籤的原因是提升網頁的語義化結構和可訪問性,使屏幕閱讀器和搜索引擎更易理解頁面內容,並允許用戶快速跳轉至核心內容。以下是關鍵要點:1.每個頁面應僅包含一個元素;2.不應包括跨頁面重複的內容(如側邊欄或頁腳);3.可與ARIA屬性結合使用以增強無障礙體驗。通常位於和之後、之前,用於包裹唯一的頁面內容,例如文章、表單或產品詳情,並應避免嵌套在、或中;為提高輔助功能,可使用aria-labelledby或aria-label明確標識部分。

如何創(chuàng)建基本的HTML文檔? 如何創(chuàng)建基本的HTML文檔? Jun 19, 2025 pm 11:01 PM

要創(chuàng)建一個基本的HTML文檔,首先需要了解其基本結構並按照標準格式編寫代碼。 1.開始時使用聲明文檔類型;2.使用標籤包裹整個內容;3.在其中包含和兩個主要部分,用於存放元數據如標題、樣式錶鍊接等,而則包含用戶可見的內容如標題、段落、圖片和鏈接;4.保存文件為.html格式並在瀏覽器中打開查看效果;5.隨後可逐步添加更多元素以豐富頁面內容。遵循這些步驟即可快速構建一個基礎網頁。

如何使用 如何使用 Jun 19, 2025 pm 11:41 PM

要創(chuàng)建HTML複選框,需使用type屬性設為checkbox的元素。 1.基本結構包含id、name和label標籤,確保點擊文字可切換選項;2.多個相關複選框應使用相同name但不同value,並用fieldset包裹提升可訪問性;3.自定義樣式時隱藏原生控件並用CSS設計替代元素,同時保持功能完整;4.確??捎眯?,配對label、支持鍵盤導航且避免僅依賴視覺提示。以上步驟能幫助開發(fā)者正確實現兼具功能與美觀的複選框組件。

隨著時間的流逝,HTML如何發(fā)展,其歷史上的關鍵里程碑是什麼? 隨著時間的流逝,HTML如何發(fā)展,其歷史上的關鍵里程碑是什麼? Jun 24, 2025 am 12:54 AM

htmlhasevolvedscreatscreationtomeetthegrowingdemandsofwebdevelopersandusers.inatelyallyasimplemarkuplanguageforsharingdocuments,ithasundergonemajorupdates,包括html.2.0,包括wheintrodistusefforms;

如何使用元素代表文檔或部分的頁腳? 如何使用元素代表文檔或部分的頁腳? Jun 25, 2025 am 12:57 AM

是HTML5中用於定義頁面或內容區(qū)塊底部的語義化標籤,通常包含版權信息、聯(lián)繫方式或導航鏈接等;它可置於頁面底部或嵌套在、等標籤內作為區(qū)塊尾部;使用時應注意避免重複濫用及放入無關內容。

如何使用Tabindex屬性來控制元素的選項卡順序? 如何使用Tabindex屬性來控制元素的選項卡順序? Jun 24, 2025 am 12:56 AM

ThetabindexattributecontrolshowelementsreceivefocusviatheTabkey,withthreemainvalues:tabindex="0"addsanelementtothenaturaltaborder,tabindex="-1"allowsprogrammaticfocusonly,andtabindex="n"(positivenumber)setsacustomtabbing

See all articles