javascript相對於其它語言來講是一種弱類型的語言,在其它如java語言中,程序的執行須要有編譯的階段javascript
而在javascript中也有相似的「預編譯階段」(javascript的預編譯是以代碼塊爲範圍<script></script>,即每遇到一個代碼塊都會進行 預編譯>執行),java
瞭解javascript引擎的執行機理,將有助於在寫js代碼過程當中的思路總結web
首先科普下javascript中的兩種聲明方式,var和function,前者聲明的是變量,後者聲明的是方法函數
在預編譯中,javascript對這兩種聲明作出了兩種處理方案spa
<script> var a = "1"; //聲明變量a function b(){ //聲明方法b alert(); } var c = function(){ //聲明變量c alert(); } </script>
以上代碼塊中,a、c爲變量賦值,b爲函數聲明,當執行以上的代碼時,code
首先會進入預編譯階段,blog
對與變量賦值a、c會在內存中開闢一塊內存空間並指向變量名,且賦值爲undefinedip
對於函數聲明,則一樣會進行開闢內存空間,但此時會直接將函數體進行處理,即用函數聲明方式,則在預編譯階段便已完成了函數的建立工做內存
預編譯階段:(PS:無論代碼中聲明變量和聲明函數的順序如何,在預編譯階段會先聲明變量,再聲明函數)作用域
<script> var a = undefined; var c = undefined;
var b = function(){
alert();
}
</script>
執行階段:
<script> a = "1"; c = function(){ alert(); } </script>
總體執行步驟:
<script> var a = undefined; var c = undefined; var b = function(){ alert(); } a = "1"; c = function(){ alert(); } </script>
題目:
<script> var a = "1"; function b(){ alert(a); var a = "2"; } b(); </script>
PS:相對與window環境下的變量、函數聲明,每個做用域都會對其下的變量和函數進行先聲明
<script> functionHello() { alert("Hello"); } Hello(); </script> <script> functionHello() { alert("Hello World"); } Hello(); </script>
<script>
function Hello() {
alert("Hello"); } Hello();
function Hello() {
alert("Hello World"); } Hello(); </script>
博客:http://www.cnblogs.com/alex-web/
注:小瘋紙的yy