Firebug報錯:Fn2 is not a function,浏覽器未對Fn2進行預處理,依序執行,所以報錯Fn2未定義。 3. 代碼塊及js文件的處理 “代碼塊”是指一對<script type=”text/javascript”></script>標簽包裹著的js代碼,文件就是指文件啦,廢話:D 浏覽器對每個塊或文件進行獨立的掃描,然後對全局的代碼進行順序執行(2中講到了)。所以,在一個塊(文件)中,函數可以在調用之後進行“定義式”定義;但在兩個塊中,定義函數所在的塊必須在函數被調用的塊之前。 很繞口,看例子好了: 復制代碼 代碼如下: <script type="text/javascript"> Fn(); </script> <script type="text/javascript"> function Fn(){ alert("Hello World!"); } </script> // 報錯:Fn is notdefined,兩個塊換過來就對了
4. 重復定義函數會覆蓋前面的定義 這和變量的重復定義是一樣的,代碼: 復制代碼 代碼如下: function fn(){ alert(1); } function fn(){ alert(2); } fn(); // 彈出:“2”
如果是這樣呢: 復制代碼 代碼如下: fn(); function fn(){ alert(1); } function fn(){ alert(2); } // 還是彈出:“2”
還是彈出“2”,為什麼?2都講了好吧… 5. body的onload函數與body內部函數的執行 body內部的函數會先於onload的函數執行,測試代碼: 復制代碼 代碼如下: //html head... <script type="text/javascript"> function fnOnLoad(){ alert("I am outside the Wall!"); } </script> <body onload="fnOnLoad();"> <script type="text/javascript"> alert("I am inside the Wall.."); </script> </body> //先彈出“I am inside the Wall..”; //後彈出“I am outside the Wall!”
body的onload事件觸發條件是body內容加載完成,而body中的js代碼會在這一事件觸發之前運行(為什麼呢?6告訴你..) 6. JavaScript是多線程or單線程? 嚴格來說,JavaScript是沒有多線程概念的,所有的程序都是“單線程”依次執行的。 舉個不太恰當的例子: 復制代碼 代碼如下: function fn1(){ var sum = 0; for(var ind=0; ind<1000; ind++) { sum += ind; } alert("答案是"+sum); } function fn2(){ alert("早知道了,我就是不說"); } fn1(); fn2(); //先彈出:“答案是499500”, //後彈出:“早知道了,我就是不說”
那你肯定要問:那延時執行、Ajax異步加載,不是多線程的嗎?沒錯,下面這樣的程序確實看起來像“多線程”: 復制代碼 代碼如下: function fn1(){ setTimeout(function(){ alert("我先調用") },1000); } function fn2(){ alert("我後調用"); } fn1(); fn2(); // 先彈出:“我後調用”, // 1秒後彈出:“我先調用”