您好,登錄后才能下訂單哦!
小編給大家分享一下JavaScript中的閉包原理是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
要了解清楚js中的閉包制機,那么得先了解全局執(zhí)行環(huán)境、塊級執(zhí)行環(huán)境、函數(shù)執(zhí)行環(huán)境、變量對象、環(huán)境棧、作用域鏈、摧毀執(zhí)行環(huán)境。
全局執(zhí)行環(huán)境
全局執(zhí)行環(huán)境指的是最外層的執(zhí)行環(huán)境。在web中全局執(zhí)行環(huán)境被認為window對象,所以你在全局環(huán)境中創(chuàng)建的變量與函數(shù)都是對象的屬性和方法。
函數(shù)執(zhí)行環(huán)境
函數(shù)執(zhí)行環(huán)境指的是函數(shù)體。
塊級執(zhí)行環(huán)境
塊級執(zhí)行環(huán)境指的是塊級定義區(qū)域。
'use strict'; // 全局執(zhí)行環(huán)境 // ..... { // 塊級執(zhí)行環(huán)境 // 代碼 .... } function func() { // 函數(shù)執(zhí)行環(huán)境 //... }
變量對象
每一個執(zhí)行環(huán)境最有一個與之關(guān)聯(lián)的變量對象,變量對象中存儲當(dāng)前環(huán)境中定義的變量與函數(shù)。在使用變量或函數(shù)時,都是在個變量對象上去尋找成員的。這個對象是無法訪問的,但是你可以在作用域鏈[scope]中查看到所定義的成員(如果沒有使用的話可能無法看到,這和優(yōu)化有關(guān))。
環(huán)境棧
每個函數(shù)或塊都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進入一個函數(shù)時,函數(shù)的環(huán)境就會被推入“環(huán)境?!敝?。函數(shù)執(zhí)行完后,棧將其彈出并銷毀變量對象,然后把控制權(quán)返回在給之前的執(zhí)行環(huán)境。如果內(nèi)執(zhí)行環(huán)境的變量對象,被外部執(zhí)行環(huán)境引用,那么內(nèi)部環(huán)境變量對象就無法被銷毀(如:閉包)。
作用域鏈
作用域鏈是一個列表,存儲著與執(zhí)行環(huán)境相關(guān)的變量對象,通過【scope】屬性可查看變量對象列表。
關(guān)系圖
實例講解
// 例子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)境的變量對象, x 表示 變量對象中的。
索引為 1 的:全局執(zhí)行環(huán)境變量對象。
// 例子2:訪問塊內(nèi)部變量
1:返回塊級內(nèi)容函數(shù) 實現(xiàn)在全局執(zhí)行環(huán)境中訪問塊級內(nèi)容變量。
'use strict'; let func = null; { let x = "你好"; func = function () { return x; } } // 返回塊級內(nèi)容函數(shù) 實現(xiàn)在全局執(zhí)行環(huán)境中訪問塊級內(nèi)容變量。 console.log(func());
作用域鏈圖:
看完了這篇文章,相信你對JavaScript中的閉包原理是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。