2009-12-11 73 views
1

爲什麼打電話時,我這樣稱呼它JavaScript函數聲明之間的區別?

wysiwyg2(); 

var wysiwyg2 = function() 
{ 
    alert(1); 
} 

,但工作我這樣做時,我的JavaScript函數拋出一個錯誤?

wysiwyg2(); 

function wysiwyg2() 
{ 
    alert(1); 
} 
+3

這個問題需要一個更好的標題。 – cletus 2009-12-11 03:32:14

回答

4

在第一個片段,你想調用在變量定義之前變量。

你會得到下面的代碼相同的問題:

test.toString(); 
var test = new Date; 

在第二個片段,你聲明函數,而不將其分配給一個變量,而這會導致全局聲明是可用於較早的代碼。

0

在第一個中,您聲明瞭一個函數並將其分配給一個變量。因此,在實際分配給它之前,您將無法通過該變量調用它。

在第二個,你聲明一個命名函數。並且可以從任何地方調用該函數(只要它在範圍內)。

+0

但這也是錯誤的: user198729 2009-12-11 03:35:00

2

你可以認爲你的javascript好像它被評估過兩遍。第一遍構建所有對象和名稱(並記住:函數是對象),並將它們放在「範圍內」,可以這麼說。這有點像彙編步驟。然後第二遍執行代碼。

因此,您的第二個示例工作,因爲第一個傳遞構建和「範圍」的功能執行前。第一個示例不起作用,因爲函數對象是作爲變量賦值的一部分創建的,所以當您嘗試調用它時,它不在範圍內。

您在註釋中提到了另一種情況,其中函數調用和定義分爲兩個腳本塊。這是行不通的,因爲引擎在移動到下一個塊之前完成了一個塊的兩個步驟,並且您試圖在定義塊之前執行的塊中調用該函數。你可以通過腳本塊調用函數,但是直到它們被定義。

0

當進入一個新執行上下文(其可以是一個函數調用或全局代碼),JavaScript的首先通過在此期間,全局代碼或功能體之內的所有變量聲明和函數聲明被檢查一個變量實例相和創建當前變量對象的屬性,它實際上是當前範圍內所有對象的集合。特別是,任何函數聲明

function wysiwyg2() 
{ 
    alert(1); 
} 

...在此階段被完全創建的,而任何變量聲明如

var a = 2;

...只會導致在此階段創建一個名爲a的變量,其值爲undefined。這也是一個變量聲明的真與分配給一個函數表達式,如

var wysiwyg2 = function() 
{ 
    alert(1); 
} 

只有變量實例發生在該點。一旦這個階段完成,剩下的代碼(包括變量賦值)就會順序執行。

相關問題