1. 程式人生 > >javascript的執行順序/函式宣告和函式表示式的區別

javascript的執行順序/函式宣告和函式表示式的區別

例子:

function myfunc ()

{
alert(”hello”);
};
myfunc(); //這裡呼叫myfunc,輸出yeah而不是hello

function myfunc ()
{
alert(”yeah”);
};
myfunc(); //這裡呼叫myfunc,當然輸出yeah

按理說,兩個簽名(即函式名)完全相同的函式,在其他程式語言中應該是非法的。但在JavaScript中,這沒錯。不過,程式執行之後卻發現一個奇怪的現象:兩次呼叫都只是最後那個函式裡輸出的值!顯然第一個函式沒有起到任何作用。這又是為什麼呢?

原來,JavaScript執行引擎並非一行一行地分析和執行程式,而是一段一段地分析執行的。而且,在同一段程式的分析執行中,定義式的函式語句會被提取出來優先執行。函式定義執行完之後,才會按順序執行其他語句程式碼。也就是說,在第一次呼叫myfunc之前,第一個函式語句定義的程式碼邏輯,已被第二個函式定義語句覆蓋了。所以,兩次都呼叫都是執行最後一個函式邏輯了。


如果把這個JavaScript程式碼分成兩段,例如將它們寫在一個html中,並用<script/>標籤將其分成這樣的兩塊:
<script>
function myfunc ()
{
alert(”hello”);
};
myfunc(); //這裡呼叫myfunc,輸出hello
</script>

<script>
function myfunc ()
{
alert(”yeah”);
};
myfunc(); //這裡呼叫myfunc,輸出yeah
</script>

這時,輸出才是各自按順序來的,也證明了JavaScript的確是一段段地執行的。

定義函式的兩種方式:函式宣告和函式表示式的區別

在一段程式碼中

對於函式宣告,解析器會率先讀取並且讓其在執行任何程式碼前可用

對於函式表示式,當解析器執行到它所在的程式碼行時,才會真正被解釋執行