溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中的閉包原理是什么

發(fā)布時間:2020-12-05 09:49:05 來源:億速云 閱讀:140 作者:小新 欄目:web開發(fā)

小編給大家分享一下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)系圖

JavaScript中的閉包原理是什么

實例講解

// 例子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ù)的作用域鏈。

JavaScript中的閉包原理是什么

[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中的閉包原理是什么

看完了這篇文章,相信你對JavaScript中的閉包原理是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(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)容。

AI