簡介
javascript是一種解釋型語言,它的執行是自上而下的。但是各瀏覽器對於【自上而下】的理解是有細微差別的,而代碼的上下遊也就是程式流對於程式正確運行又是至關重要的。所以我們有必要深入理解js的執行順序。為此,我設計了如下八個實驗來獲得最確切的結果。
斌斌 (給我寫信) 原創博文(http://blog.csdn.net/binbinxyz),轉載請註明出處!
實驗
<script type="text/javascript">//實驗一:function t(a){alert("[t(a)]a:" + a);}function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}t(1);//結果://[t(a, b)]a:1, b:undefined//實驗二:function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}function t(a){alert("[t(a)]a:" + a);}t(1);//結果://[t(a)]a:1//實驗三:function t(a){alert("[t(a)]a:" + a);}function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}t(1, 2);//結果://[t(a, b)]a:1, b:2//實驗四:function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}function t(a){alert("[t(a)]a:" + a);}t(1, 2);//結果://[t(a)]a:1//實驗五function t(a){alert("[t(a)]a:" + a);}t(1);function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}//結果://[t(a, b)]a:1, b:undefined//實驗六function t(a){alert("[t(a)]a:" + a);}t(1, 2);function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}//結果://[t(a, b)]a:1, b:2//實驗七function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}t(1);function t(a){alert("[t(a)]a:" + a);}//結果://[t(a)]a:1//實驗八function t(a, b){alert("[t(a, b)]a:" + a + ", b:" + b);}t(1, 2);function t(a){alert("[t(a)]a:" + a);}//結果://[t(a)]a:1</script>
後記定義javascript函數時,函數名是函數對象的標識,參數數量只是這個函數的屬性。靠定義參數數量不同的函數實現重載是不行的。
調用函數時,js通過函數名找到對應的函數對象,然後根據函數定義時的參數,和運算式參數列表按順序匹配,多餘的參數捨去,不夠的參數按undefined處理,然後執行函數代碼。
所以定義函數時,通常把必選參數放在參數列表最前面,選擇性參數放在必選參數後面。
注意事項一、上述八個實驗的結果是經過360瀏覽器(版本/核心:6.3.1.142/21.0.1180.89)和Firefox瀏覽器(版本:27.0.1)運行得出的。
二、上述八個實驗是相互獨立的,請分別單獨運行以得到正確的結果。