久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理(圖文詳解)

      本篇文章給大家?guī)?lái)關(guān)于JavaScript中塊級(jí)作用域的實(shí)現(xiàn)原理相關(guān)知識(shí),在ES6之前,塊級(jí)作用域是不被JavaScript所支持的,JavaScript是通過(guò)什么支持了塊級(jí)作用域的呢?本文將講解塊級(jí)作用域的底層實(shí)現(xiàn)原理,希望對(duì)大家有幫助。

      JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理(圖文詳解)

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

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

      作用域

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

      執(zhí)行上下文

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

      執(zhí)行棧

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

      以下面的代碼為例:

      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)用程序退出前才會(huì)被銷毀,比如關(guān)閉網(wǎng)頁(yè)或者退出瀏覽器

      JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理(圖文詳解)

      javascript 是如何支持塊級(jí)作用域的

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

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

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

      JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理(圖文詳解)

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

      JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理(圖文詳解)

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

      JavaScript塊級(jí)作用域的實(shí)現(xiàn)原理(圖文詳解)

      總結(jié)

      我們可以知道上面問(wèn)題的答案:

      用let 聲明出來(lái)的變量中都會(huì)在詞法環(huán)境中存放,塊級(jí)作用域是通過(guò)詞法環(huán)境的棧結(jié)構(gòu)來(lái)實(shí)現(xiàn)的,而變量提升是通過(guò)變量環(huán)境來(lái)實(shí)現(xiàn)的,兩者結(jié)合就同時(shí)支持變量提升和塊級(jí)作用域

      以及變量的查找方式:

      從詞法環(huán)境的作用域棧頂開(kāi)始向下查找,如果找到了就返回值,如果找不到,就繼續(xù)去變量環(huán)境中查找

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)