下面是有效的JavaScript代碼:瀏覽器是否加載了一整塊JavaScript代碼在執行之前?
<script>
foo();
function foo()
{
alert("foo");
}
</script>
函數foo在它的聲明之前被調用。所以,我認爲瀏覽器必須在執行之前加載整個塊腳本。對於「整塊」,我的意思是打開標籤到一個clos標籤或一個外部JavaScript文件。這是真的?
下面是有效的JavaScript代碼:瀏覽器是否加載了一整塊JavaScript代碼在執行之前?
<script>
foo();
function foo()
{
alert("foo");
}
</script>
函數foo在它的聲明之前被調用。所以,我認爲瀏覽器必須在執行之前加載整個塊腳本。對於「整塊」,我的意思是打開標籤到一個clos標籤或一個外部JavaScript文件。這是真的?
如果一個方法或變量是未定義的,它會拋出一個錯誤「未定義」,但如果它被聲明但沒有賦值,那麼js不會拋出任何錯誤。
<script>
foo();
function foo()
{
alert("foo");
}
</script>
但是你的代碼不會拋出任何異常,你也可以很容易地調試你的javascript代碼。這裏是一個很好的視頻顯示如何調試js代碼:Debugging with Firebug
不,不,不。 你可以試試它。在同一個塊中,可以在聲明前使用函數。 –
@Morgan:對不起我的錯誤,我弄錯了函數var hello = function(){}和函數hello()。謝謝。 – Tarik
當我把這個JS粘貼到Firebug中時,我得到「foo沒有定義」。
JS的大部分實現將加載整個文件,然後執行它。該文件中的語句是順序執行的,所以呼叫到函數foo其定義,這是所要求的ECMA 262標準節8.7.1
@Berry,你如何將它粘貼到Firebug中? 你可以將它粘貼到html中並用Firefox打開它。我敢打賭它會奏效。 –
Firebug有一個調試控制檯,您可以在自己的上下文中執行自定義代碼。 – LiraNuna
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";
}());
http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – eyelidlessness