2009-10-03 78 views
0

下面是有效的JavaScript代碼:瀏覽器是否加載了一整塊JavaScript代碼在執行之前?

<script> 
    foo(); 

    function foo() 
    { 
    alert("foo"); 
    } 
</script> 

函數foo在它的聲明之前被調用。所以,我認爲瀏覽器必須在執行之前加載整個塊腳本。對於「整塊」,我的意思是打開標籤到一個clos標籤或一個外部JavaScript文件。這是真的?

+1

http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – eyelidlessness

回答

1

如果一個方法或變量是未定義的,它會拋出一個錯誤「未定義」,但如果它被聲明但沒有賦值,那麼js不會拋出任何錯誤。

<script> 
    foo(); 

    function foo() 
    { 
    alert("foo"); 
    } 
</script> 

但是你的代碼不會拋出任何異常,你也可以很容易地調試你的javascript代碼。這裏是一個很好的視頻顯示如何調試js代碼:Debugging with Firebug

+1

不,不,不。 你可以試試它。在同一個塊中,可以在聲明前使用函數。 –

+0

@Morgan:對不起我的錯誤,我弄錯了函數var hello = function(){}和函數hello()。謝謝。 – Tarik

0

當我把這個JS粘貼到Firebug中時,我得到「foo沒有定義」。

JS的大部分實現將加載整個文件,然後執行它。該文件中的語句是順序執行的,所以呼叫到函數foo其定義,這是所要求的ECMA 262標準節8.7.1

+1

@Berry,你如何將它粘貼到Firebug中? 你可以將它粘貼到html中並用Firefox打開它。我敢打賭它會奏效。 –

+0

Firebug有一個調試控制檯,您可以在自己的上下文中執行自定義代碼。 – LiraNuna

2

Function statements受到錯誤之前發生吊裝。這意味着無論函數在哪裏聲明,它都會移到它所在的範圍的頂部。

(function() { 
    foo(); 

    function foo() { 
    alert('foo is beign called'); 
    } 
}()); 

在編譯時該代碼的結構將改變爲:

(function() { 
    function foo() { 
    alert('foo is beign called'); 
    } 

    foo(); 
}()); 

函數語句不是受吊裝而已,var聲明還,因爲這樣(和,因爲JavaScript富人只函數作用域)被推薦爲具有僅one var statement在函數的頂部,例如:

var bar = "baz"; // on the outer scope 
(function() { 
    alert(bar); // bar is undefined 

    var bar = "other value"; 
}()); 

警報顯示undefined,因爲內部代碼改成這樣:

var bar = "baz"; 
(function() { 
    var bar; 
    alert(bar); // bar is undefined 

    bar = "other value"; 
}()); 
相關問題