標籤:
如果想要學好JavaScript那麼我們首先必須要知道瀏覽器JavaScript引擎是如何解釋執行JavaScript代碼的,作為一名菜鳥,從自己學習JavaScript的過程來說,真心覺得不瞭解這些在以後的學習JavaScript過程中會徒增許多困惑,多走許多彎路.好了廢話不多說了,我們就一起來看看到底怎麼一個過程吧.
瀏覽器在執行JavaScript代碼之前會進行類似寫C和C++一樣的先行編譯操作,在先行編譯的階段,首先建立一個當前執行環境下的使用中的物件,並且將那些用 var 聲明的變數設定為當前使用中的物件的屬性,但是這些變數的初始化的賦值都是undefined;而對於那些function 定義的函數也添加為當前使用中的物件的屬性,而他們的值賦予的是函數的定義,特別提醒下對於下面的代碼不要誤解,匿名函數是不會被解析的,funTemp的初始化依舊在執行階段;
1 var funTemp=function() { //匿名函數2 alert("Hello World!");3 }
針對先行編譯階段我們為了便於理解驗證,那麼首先舉例來看一看:
1 <script type="text/javascript"> 2 alert(tempFirst); //傳回值undefined 3 var tempFirst="麥兜"; 4 alert(tempFirst); //傳回值 麥兜 5 6 alert(Hello); //傳回值 函數Hello定義語句 7 alert(Hello()); //傳回值 Hello JavaScript 8 function Hello(){ 9 alert("Hello JavaScript");10 }11 12 alert(Hi()); //傳回值 undefined13 var Hi=function (){14 alert("Hi JavaScript");15 }16 17 </script>
先行編譯階段結束後我們來看看執行階段是如何進行的,首先遇到變數需要解析時候,會首先從當前的執行環境中的使用中的物件進行尋找,如果沒有找到但是該使用中的物件擁有prototype屬性中進行尋找,沒有找到的話按照範圍鏈繼續尋找.遇到var a=...這樣的語句時候則會給相應的變數a進行賦值,下面我們舉個有意思例子來加深下對這個概念的理解。
1 1 <script type="text/javascript"> 2 2 3 3 var name="Sudo"; 4 4 5 5 function nameScope() 6 6 { 7 7 alert(name); // 傳回值 undefined 8 8 var name="Admin"; 9 9 alert(name); // 傳回值 Admin10 10 }11 11 nameScope();12 12 alert(name); // 傳回值 Sudo13 13 </script>
在執行nameScope()函數時候,第一個alert(name)會先從該函數的範圍裡面尋找name屬性,因為在先行編譯的時候確實賦予了當前範圍裡面有name屬性,並且賦值為undefined,找到了以後當然不會去尋找外圍的全域name了,所以先彈出undefined,然後函數裡面對其賦值admin初始化,繼而彈出Admin,同樣在函數執行完成後,類似與其他語言裡面的解構函式一樣,所有佔用的記憶體全部釋放了,而其變數也僅僅在當前函數內執行有效,最外面alert(name),則訪問的即是全域變數sudo為彈出結果,留給有意思的代碼,猜猜結果
1 <script type="text/javascript"> 2 3 var name="Sudo"; 4 5 function nameScope() 6 { 7 alert(name); // 傳回值 Sudo 8 name="Admin"; 9 alert(name); // 傳回值 Admin10 }11 nameScope();12 alert(name); // 傳回值 Admin13 </script>
好了,其實這些是自己一邊學習一邊總結的,以後或多或少肯定會有錯誤,希望大家提點下哦,
JavaScript自我學習之解析與執行