溫馨提示×

溫馨提示×

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

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

JavaScript塊級作用域的實現(xiàn)原理是什么

發(fā)布時間:2022-02-07 09:21:35 來源:億速云 閱讀:123 作者:iii 欄目:web開發(fā)

這篇文章主要講解了“JavaScript塊級作用域的實現(xiàn)原理是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JavaScript塊級作用域的實現(xiàn)原理是什么”吧!

JavaScript塊級作用域的實現(xiàn)原理是什么

作用域與執(zhí)行上下文

很多人覺得作用域與執(zhí)行上下文是一個概念,這種想法是完全錯誤的!

作用域

作用域在函數(shù)聲明時就已經(jīng)確定了,作用域是據(jù)名稱來查找變量的一套規(guī)則,也就是確定了當(dāng)前執(zhí)行代碼對變量的訪問權(quán)限。JavaScript一共支持三種類型的作用域,它們分別是:全局作用域、函數(shù)作用域、塊級作用域。

執(zhí)行上下文

執(zhí)行上下文是js引擎從解釋到運行中間預(yù)編譯時對執(zhí)行做的準(zhǔn)備工作,創(chuàng)建了當(dāng)前區(qū)域的執(zhí)行環(huán)境,這個執(zhí)行環(huán)境就是執(zhí)行上下文。

執(zhí)行棧

調(diào)用棧用來裝js代碼中的各種執(zhí)行上下文,是js引擎追蹤函數(shù)執(zhí)行的一個機制。

以下面的代碼為例:

console.log(1);
function pFn() {
    console.log(2);
    (function cFn() {
        console.log(3);
    }());
    console.log(4);
}
pFn();
console.log(5);
//輸出:1 2 3 4 5

先有全局環(huán)境下的執(zhí)行上下文,調(diào)用pFn后將函數(shù)環(huán)境pFn的執(zhí)行上下文壓入棧中,由于pFn中執(zhí)行了cFn函數(shù),所以繼續(xù)壓入cFn函數(shù)的執(zhí)行上下文,執(zhí)行完畢后依次出棧。

全局上下文只有應(yīng)用程序退出前才會被銷毀,比如關(guān)閉網(wǎng)頁或者退出瀏覽器

JavaScript塊級作用域的實現(xiàn)原理是什么

javascript 是如何支持塊級作用域的

我們知道在js中由于初始設(shè)計的不規(guī)范,用var關(guān)鍵字定義變量會導(dǎo)致變量提升等一系列問題,但為了保持兼容性,我們也不得不對var聲明變量這種方式保留支持,那么:JavaScript是如何做到既要支持變量提升,又要支持塊級作用域的呢?

我們以下面這段代碼為例:

function foo() {
   var a = 1;
   let b = 2;
   {
   let b = 3;
   var c = 4;
   let d = 5;
   console.log(a);
   console.log(b);
   }
   console.log(b);
   console.log(c);
   console.log(d);
}

首先函數(shù)內(nèi)部通過var聲明的變量被存放到變量環(huán)境中,通過let聲明的變量在預(yù)編譯階段被存放到詞法環(huán)境中,當(dāng)然在函數(shù)體內(nèi)部塊作用域中l(wèi)et聲明的變量并沒有被存放到詞法環(huán)境中。

JavaScript塊級作用域的實現(xiàn)原理是什么

繼續(xù)執(zhí)行代碼,當(dāng)執(zhí)行到代碼塊里面時,變量環(huán)境中的a的值已經(jīng)被設(shè)置為1,詞法環(huán)境中b的值已經(jīng)被設(shè)置成了2,注意用let聲明的變量b和d此時不是underfined而是uninitialized未初始化

JavaScript塊級作用域的實現(xiàn)原理是什么

最后當(dāng)函數(shù)體內(nèi)塊作用域執(zhí)行結(jié)束之后,其內(nèi)部變量就會從詞法環(huán)境的棧頂彈出

JavaScript塊級作用域的實現(xiàn)原理是什么

感謝各位的閱讀,以上就是“JavaScript塊級作用域的實現(xiàn)原理是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對JavaScript塊級作用域的實現(xiàn)原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向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