以下全是個人理解以及網上查找而來,如有不對請指正...
假如有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
這是因爲作用域鏈的關係