站長資訊網
        最全最豐富的資訊網站

        JavaScript塊級作用域的實現原理(圖文詳解)

        本篇文章給大家帶來關于JavaScript中塊級作用域的實現原理相關知識,在ES6之前,塊級作用域是不被JavaScript所支持的,JavaScript是通過什么支持了塊級作用域的呢?本文將講解塊級作用域的底層實現原理,希望對大家有幫助。

        JavaScript塊級作用域的實現原理(圖文詳解)

        作用域與執行上下文

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

        作用域

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

        執行上下文

        執行上下文是js引擎從解釋到運行中間預編譯時對執行做的準備工作,創建了當前區域的執行環境,這個執行環境就是執行上下文。

        執行棧

        調用棧用來裝js代碼中的各種執行上下文,是js引擎追蹤函數執行的一個機制。

        以下面的代碼為例:

        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

        先有全局環境下的執行上下文,調用pFn后將函數環境pFn的執行上下文壓入棧中,由于pFn中執行了cFn函數,所以繼續壓入cFn函數的執行上下文,執行完畢后依次出棧。

        全局上下文只有應用程序退出前才會被銷毀,比如關閉網頁或者退出瀏覽器

        JavaScript塊級作用域的實現原理(圖文詳解)

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

        我們知道在js中由于初始設計的不規范,用var關鍵字定義變量會導致變量提升等一系列問題,但為了保持兼容性,我們也不得不對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); }

        首先函數內部通過var聲明的變量被存放到變量環境中,通過let聲明的變量在預編譯階段被存放到詞法環境中,當然在函數體內部塊作用域中let聲明的變量并沒有被存放到詞法環境中。

        JavaScript塊級作用域的實現原理(圖文詳解)

        繼續執行代碼,當執行到代碼塊里面時,變量環境中的a的值已經被設置為1,詞法環境中b的值已經被設置成了2,注意用let聲明的變量b和d此時不是underfined而是uninitialized未初始化

        JavaScript塊級作用域的實現原理(圖文詳解)

        最后當函數體內塊作用域執行結束之后,其內部變量就會從詞法環境的棧頂彈出

        JavaScript塊級作用域的實現原理(圖文詳解)

        總結

        我們可以知道上面問題的答案:

        用let 聲明出來的變量中都會在詞法環境中存放,塊級作用域是通過詞法環境的棧結構來實現的,而變量提升是通過變量環境來實現的,兩者結合就同時支持變量提升和塊級作用域

        以及變量的查找方式:

        從詞法環境的作用域棧頂開始向下查找,如果找到了就返回值,如果找不到,就繼續去變量環境中查找

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲AV永久无码精品水牛影视| 精品欧洲av无码一区二区| 在线精品动漫一区二区无广告| 国语自产精品视频| 亚洲欧美一级久久精品| 国产午夜精品一本在线观看| 国产AV无码专区亚洲精品 | 日本aⅴ精品中文字幕| 国产精品99久久精品| 日韩精品国产另类专区| 无码人妻精品一区二| 亚洲精品欧美综合| 91精品国产综合久久精品| 久久棈精品久久久久久噜噜| 国产精品高清在线| 国产精品无码av在线播放| 色欲精品国产一区二区三区AV| 精品一区二区三区免费| 伊人 久久 精品| 日韩经典精品无码一区| 久久99精品免费一区二区| 国产精品女人呻吟在线观看| 奇米精品视频一区二区三区| 一本一本久久A久久综合精品| 久久久久人妻一区精品果冻| 国产午夜精品一本在线观看| 精品国产免费人成网站| 国产精品专区第二| 亚洲AV无码精品无码麻豆| 成人国产精品秘 果冻传媒在线| 国产精品电影在线观看| AAA级久久久精品无码片| 欧美成人精品网站播放| 精品国产热久久久福利| 精品国产成人在线| 亚洲国产精品成人午夜在线观看 | 久久久久99精品成人片牛牛影视| 国产欧美精品区一区二区三区| 国产99久久久国产精品~~牛| 日本精品久久久久中文字幕| 欧美精品黑人巨大在线播放|