對Javascript到底瞭解多少,一測便知道

來源:互聯網
上載者:User

標籤:blog   使用   span   記憶體回收機制   log   提升   垃圾   邏輯   def   

  筆者在這裡附上一段代碼,請讀者思考一下程式的運行結果:

        console.log(a);  //???        a();         var a=3;          function a(){            console.log(10);        }        console.log(a);//???        a=6;                

  

  運行結果如下:

 

  

     console.log(a);  //輸出function a(){}        a();         var a=3;          function a(){            console.log(10);        }        console.log(a);//3        a=6;

    

   不知道讀者有沒有猜對呢?哈哈,可能很多讀者會認為第一行的console.log(a);會輸出undefine ,因為大家都知道變數提升與函數提升,而Javascript編譯器執行代碼也是逐行執

行,當js檔案首先載入到記憶體時,編譯器便會對代碼執行先行編譯,將代碼中的var 聲明與function聲明提升到頭部,再一行行的去執行代碼,那這樣的邏輯的話,可能讀者會想,既然

變數提升,上面的代碼在先行編譯期間應該首先會提升var a,再提升function a(){}, 等執行console.log(a)的時候,自然輸出undefine,沒有被定義才對啊。

    這裡向讀者強調一下一個容易被忽視的小問題。,雖然JS先行編譯期間會對var 和 函式宣告提升,但是函式宣告提升是優先於變數提升的(也適用於函數字面量聲明的情況,這

裡不做示範),所以應該是先提升function a(){}.再提升var a,所以第一行輸出了function a(){},有沒有一種恍然大悟呢?哈哈。

 而console.log(a);這一行為什麼輸出3而不是6或者function a(){} 呢,我們再回憶一下JS已經將function a(){} 與var a 提升到了頭部,首先分析末尾的代碼a=6;這行代碼編譯器

並沒有執行到這一行,所以忽略,現在就是糾結到底是3還是function a(){},,而輸出結果卻告訴我們是3,至於已經聲明過的function a(){},去哪裡了呢。

 這裡為讀者解析一下程式的運行狀態,在我們先行編譯階段function a(){}和var a已經存在於記憶體中,只是這時var a並沒有被賦值,而接下來執行了a(),這裡我們要強調一下,

每種語言都有記憶體回收機制,程式中已經用過的函數,當他執行完畢後,便會被當做記憶體回收掉,而a()執行完後 ,便會被回收,而記憶體裡面只剩下了var a; 接下來再執行下一

句var a=3;所以末尾的console.log(a);便輸出了3 而不是function a(){}。

 

   總結:第一、JS先行編譯階段函式宣告提升優先於變數提升,第二、當函數被使用後,便會被記憶體回收。

 

   

 

    

對Javascript到底瞭解多少,一測便知道

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.