javascript 運行機制

以下全是個人理解以及網上查找而來,如有不對請指正...

 

假如有n段js代碼 用<script>標籤隔開的.

運行順序是

step1. 讀入第一個代碼段
step2. 做語法分析,有錯則報語法錯誤(比如括號不匹配等),並跳轉到step5
step3. 對var變量和function定義做“預解析”(永遠不會報錯的,因爲只解析正確的聲明)
step4. 執行代碼段,有錯則報錯(比如變量未定義)
step5. 如果還有下一個代碼段,則讀入下一個代碼段,重複step2
step6. 結束

 

這些是從網上找到的  至於對錯  真的不知道如何驗證,就暫時當它是正確的.........

js是解釋型語言,通過詞法分析和語法分析得到語法樹後,就可以開始解釋執行了。(語法分析 ,詞法分析這個我也沒研究過)

 

另外還有一些概念  如預編譯

1. 在執行前會進行類似“預編譯”的操作:首先會創建一個當前執行環境下的活動對象,並將那些用var申明的變量設置爲活動對象的屬性,但是此時這些變量的賦值都是undefined,並將那些以function定義的函數也添加爲活動對象的屬性,而且它們的值正是函數的定義。

 

2.在解釋執行階段,遇到變量需要解析時,會首先從當前執行環境的活動對象中查找,如果沒有找到而且該執行環境的擁有者有prototype屬性時則會從prototype鏈中查找,否則將會按照作用域鏈查找。遇到var a = ...這樣的語句時會給相應的變量進行賦值(注意:變量的賦值是在解釋執行階段完成的,如果在這之前使用變量,它的值會是undefined)

 

預編譯應該在上面的哪個階段開始執行了

我覺得應該是step3    因爲是類似“預編譯”,實際上是已經開始執行了.所以應該是 3;

可以看一下下面的例子

<script>

alert(i);

</script>

會報告錯誤 提示i未定義

 

<script>
alert(i);
var i=1;
</script>

會談出undefine

不會報告錯誤  跟預定義的解釋一樣...........

 

還有就是在解析的時候 有個先後順序  那就是先解析函數 在解析變量

且 函數的作用域是在定義的時候,而不是執行時候的作用域

一個例子

<script>
var c = "123";
function xx(){
 alert(c);
 var c="xx";
}
xx()
</script>

出現的是undefined

 

因爲先解析的xx  所以是找不到c的

又因爲編譯的關係,知道了在 xx()內部有一個c變量,所以會有一個undefined的直

在運行xx()的時候  因爲有undefined的直就彈出來了

如果沒有下面的那個 var c = "xx"

<script>
var c = "123";
function xx(){
 alert(c);
}
xx()
</script>

會彈出來123

這是因爲作用域鏈的關係

 

 

發佈了73 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章