2012-10-04 22 views
2

可能重複:
JavaScript: var functionName = function() {} vs function functionName() {}有人可以解釋我用這個Javascript的範圍問題嗎?

我有一些JavaScript它主要工作,除了這一個功能,我可以從某些領域而不是其他人打電話。這似乎是一個範圍問題,但我不知道爲什麼。

$().ready(function() { 
    UpdateElfDisplay(); // <--- Undefined 

    $('#Attribute1').change(function() { 
     UpdateElfDisplay(); // <--- Works just fine. 
    }); 

    var UpdateElfDisplay = function() { 
     // ... some work done here 
    }; 
}); 

正如我上面標註的UpdateElfDisplay功能工作正常,當我把它從.change()函數,但我得到一個「未定義」如果我試圖把它加載文檔時。有人可以解釋爲什麼,或者指引我描述這一點。

+0

嘗試在第一次調用之前移動UpdateElfDisplay函數聲明。 – Ram

+0

@epascarello - 嗯。我可以看到爲什麼有些人可能會認爲這是一個重複的問題,因爲現在看起來答案是一樣的。但是,我認爲這個問題是完全不同的。例如,「天空是什麼顏色?」和「海洋是什麼顏色?」可能有相同的答案,但不是重複的問題。 –

+0

這是相同的答案,只是不同的方式來問它。大聲笑 – epascarello

回答

5

你在定義它之前調用函數,所以它不起作用。處理程序中的一個稍後調用,因此它可以工作

如果使用函數聲明,它將被「懸掛」並且可以工作。

function UpdateElfDisplay() { 
    // ... some work done here 
} 

JavaScript解釋器在評估任何表達式之前評估函數的聲明形式。


旁註

這是一個類型錯誤而不是的ReferenceError是,var UpdateElfDisplay實際上是懸掛類似於函數聲明的原因,但分配本身沒有懸掛。

這意味着該變量存在,但它還沒有分配的值。


附註2

你的處理器很可能被改寫這樣的:

$('#Attribute1').change(UpdateElfDisplay); 
+0

嗯,實際上在.change處理程序上有更多的工作要做,我只是縮寫它來展示我的問題。但你現在回答非常清楚。謝謝。 –

+0

@SailingJudo:不客氣。 –

4
var UpdateElfDisplay = function() { 

直到這條線,UpdateElfDisplay尚未iniitalized。

+0

這個答案當然是完全正確的,我給它+1。所選答案有更多有用的細節。 –

相關問題