小編給大家分享一下JavaScript中的閉包原理是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)專注于遠(yuǎn)安企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),購(gòu)物商城網(wǎng)站建設(shè)。遠(yuǎn)安網(wǎng)站建設(shè)公司,為遠(yuǎn)安等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)要了解清楚js中的閉包制機(jī),那么得先了解全局執(zhí)行環(huán)境、塊級(jí)執(zhí)行環(huán)境、函數(shù)執(zhí)行環(huán)境、變量對(duì)象、環(huán)境棧、作用域鏈、摧毀執(zhí)行環(huán)境。
全局執(zhí)行環(huán)境
全局執(zhí)行環(huán)境指的是最外層的執(zhí)行環(huán)境。在web中全局執(zhí)行環(huán)境被認(rèn)為window對(duì)象,所以你在全局環(huán)境中創(chuàng)建的變量與函數(shù)都是對(duì)象的屬性和方法。
函數(shù)執(zhí)行環(huán)境
函數(shù)執(zhí)行環(huán)境指的是函數(shù)體。
塊級(jí)執(zhí)行環(huán)境
塊級(jí)執(zhí)行環(huán)境指的是塊級(jí)定義區(qū)域。
'use strict'; // 全局執(zhí)行環(huán)境 // ..... { // 塊級(jí)執(zhí)行環(huán)境 // 代碼 .... } function func() { // 函數(shù)執(zhí)行環(huán)境 //... }
變量對(duì)象
每一個(gè)執(zhí)行環(huán)境最有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,變量對(duì)象中存儲(chǔ)當(dāng)前環(huán)境中定義的變量與函數(shù)。在使用變量或函數(shù)時(shí),都是在個(gè)變量對(duì)象上去尋找成員的。這個(gè)對(duì)象是無(wú)法訪問的,但是你可以在作用域鏈[scope]中查看到所定義的成員(如果沒有使用的話可能無(wú)法看到,這和優(yōu)化有關(guān))。
環(huán)境棧
每個(gè)函數(shù)或塊都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入“環(huán)境棧”中。函數(shù)執(zhí)行完后,棧將其彈出并銷毀變量對(duì)象,然后把控制權(quán)返回在給之前的執(zhí)行環(huán)境。如果內(nèi)執(zhí)行環(huán)境的變量對(duì)象,被外部執(zhí)行環(huán)境引用,那么內(nèi)部環(huán)境變量對(duì)象就無(wú)法被銷毀(如:閉包)。
作用域鏈
作用域鏈?zhǔn)且粋€(gè)列表,存儲(chǔ)著與執(zhí)行環(huán)境相關(guān)的變量對(duì)象,通過【scope】屬性可查看變量對(duì)象列表。
關(guān)系圖
實(shí)例講解
// 例子1:常見的函數(shù)嵌套
'use strict'; function a() { let x = 2; return function() { return x; } } let func = a(); // 返回a函數(shù)體內(nèi)的 匿名函數(shù) console.log(func()); // 在全局執(zhí)行環(huán)境中,訪問a函數(shù)內(nèi)部變量。 如果是非閉包函數(shù),那么執(zhí)行完后
我們來看一下,a函數(shù)體內(nèi)匿名函數(shù)的作用域鏈。
[Scopes] : 是當(dāng)前匿名函數(shù)的作用域鏈。
索引為 0 的:是a函數(shù)的執(zhí)行環(huán)境的變量對(duì)象, x 表示 變量對(duì)象中的。
索引為 1 的:全局執(zhí)行環(huán)境變量對(duì)象。
// 例子2:訪問塊內(nèi)部變量
1:返回塊級(jí)內(nèi)容函數(shù) 實(shí)現(xiàn)在全局執(zhí)行環(huán)境中訪問塊級(jí)內(nèi)容變量。
'use strict'; let func = null; { let x = "你好"; func = function () { return x; } } // 返回塊級(jí)內(nèi)容函數(shù) 實(shí)現(xiàn)在全局執(zhí)行環(huán)境中訪問塊級(jí)內(nèi)容變量。 console.log(func());
作用域鏈圖:
看完了這篇文章,相信你對(duì)JavaScript中的閉包原理是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。