javascript小記-javascript運行機制


任何語言的運行過程中,都會有編譯執行

對於傳統編譯型語言來說,編譯步驟分為:詞法分析、語法分析、語義檢查、代碼優化和字節生成。
但對於解釋型語言來說,通過詞法分析和語法分析得到語法樹后,就可以開始解釋執行了。
(任何語言都有編譯過程,只是解釋型語言沒有編譯成二進制代碼)

 

一、javascript的運行機制:

step1.
讀入第一個代碼段(<script></script>)

step2.(編譯
語法分析,有錯則報語法錯誤(比如括號不匹配),跳轉到step5

step3.(編譯
對var變量和function定義做'預解析'(變量聲明,函數聲明,不會報錯,因為只解析正確的聲明)

step4.(執行
執行代碼段,有錯則報錯(比如變量未定義)

step5.
讀入下一個代碼段,重復執行step2

 

在編譯的時候,確定作用域,生成語法樹

      除了做必要的語法檢查之外,會將 函數的聲明和變量作用域的聲明放入到語法樹

在執行的時候,取得作用域

      確定執行上下文

 

 二、

來看一個例子

1 <script type="text/javascript">
2     alert(i);
3     var i='fanfan';
4 </script>

上例會輸出 undefined,這就會涉及到js中作用域的問題;

在js編譯的過程中,要確定作用域,此例中,在編譯的時候已經找到了變量 i 的聲明,

只是在執行的時候,由於變量i未被初始化,所以輸出undefined;

 

再來看一個例子

1 <script type="text/javascript">
2     alert(i);
3     i='fanfan';
4 </script>

上例會報錯,根據js的運行步驟,在編譯過程中確實作用域的時候,

變量 i ,由於沒有var,符合全局變量,所以 i 就相當於在全局對象window上添加了一個屬性

i=window.i

但是在程序執行的過程中,確定作用域的時候,由於當前作用域未找到變量 i 的定義,會一直找到全局作用域

但在alert的時候,此時變量 i ,還沒有添加到全局對象window上,所以會報錯,ReferenceError: i is not defined

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM