javascript
JS中的预编译(词法分析)阶段和执行阶段
javascript相對于其它語言來說是一種弱類型的語言,在其它如java語言中,程序的執行需要有編譯的階段,而在javascript中也有類似的“預編譯階段”(javascript的預編譯是以代碼塊為范圍<script></script>,即每遇到一個代碼塊都會進行? 預編譯>執行),了解javascript引擎的執行機理,將有助于在寫js代碼過程中的思路總結
首先科普下javascript中的兩種聲明方式,var和function,前者聲明的是變量,后者聲明的是方法
在預編譯中,javascript對這兩種聲明做出了兩種處理方案
| 1 2 3 4 5 6 7 8 9 | <script> var a = "1"; //聲明變量a ?function b(){ //聲明方法b ?? alert(); } var c = function(){ //聲明變量c alert(); } </script> |
以上代碼塊中,a、c為變量賦值,b為函數聲明,當執行以上的代碼時,首先會進入預編譯階段,對與變量賦值a、c會在內存中開辟一塊內存空間并指向變量名,且賦值為undefined
對于函數聲明,則同樣會進行開辟內存空間,但賦值的對象會將聲明的函數賦值給函數名
預編譯階段:(PS:不管代碼中聲明變量和聲明函數的順序如何,在預編譯階段會先聲明變量,再聲明函數)
| 1 2 3 4 5 | <script> var a = undefined; var c = undefined; var b = function(){ alert(); } </script> |
?執行階段:
| 1 2 3 4 5 6 | <script> a = "1"; c = function(){ alert(); } </script> |
整體執行步驟:
| 1 2 3 4 5 6 7 8 9 10 11 12 | <script> var a = undefined; var c = undefined; var b = function(){ alert(); } a = "1"; c = function(){ alert(); } </script> |
題目:
| 1 2 3 4 5 6 7 8 | <script> var a = "1"; function b(){ alert(a); var a = "2"; } b(); </script> |
ps:javascript的預編譯
??? 一、先預定義變量,再預定義函數
二、變量的預編譯只作聲明,不作初始化,初始化在執行時
? 三、function語句定義的函數,不僅聲明了函數名,而且函數體也進行了處理
四、匿名函數不會預編譯
| 1 2 3 4 | function f(){????? // 聲明函數f? return 1; } alert(f());?????? // 返回1 var f = function(){??? // 定義匿名函數f? return 2; } alert(f());?????? // 返回2 |
先預定義了變量f,然后同名函數f()覆蓋了變量f,所以第一次輸出1;變量的預編譯
| 1 2 3 4 5 6 | var f = function(){??? // 定義匿名函數f? return 1; } alert(f());?????? // 返回1 function f(){????? // 聲明函數f? return 2; } alert(f());????? // 返回1 |
先預定義了變量f,然后同名函數f()覆蓋了變量f.
轉載于:https://www.cnblogs.com/liuguniang/p/6916035.html
總結
以上是生活随笔為你收集整理的JS中的预编译(词法分析)阶段和执行阶段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D 资源加载 Resourc
- 下一篇: 000 SpringMVC介绍