2013-10-10 47 views
4

我正在閱讀關於函數聲明和函數表達式之間區別的博客。使用命名函數表達式的要點是什麼?

它給出了這兩個例子。他們稱第一個爲「匿名函數表達式」,第二個爲「命名函數表達式」。

// anonymous function expression 
var a = function(){ 
    return 3; 
} 

// named function expression 
var b = function bar(){ 
    return 3; 
} 

我測試這兩個在Chrome瀏覽器的JS控制檯,我看到以下內容:

a() 
=> 3 

b() 
=> 3 

bar() 
=> bar is not defined 

我的問題是:在第二個函數表達式聲明,什麼是「酒吧」的地步?一般來說,爲什麼有人使用一個命名的函數表達式?

+0

http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html,http://kangax.github.com/nfe/ – Bergi

+2

@Juhana不是很好的重複,那裏的答案(和在其中一個被標記爲「笨蛋」)只處理提升和堆棧跟蹤。這裏至少有一個其他答案也提到了遞歸。但是,我找不到更好的騙局... – bfavaretto

回答

7

有些人喜歡這樣做,因爲如果發生錯誤,你的功能就有名字。這主要是一個偏好問題,您經常遇到未命名函數的問題。

你通常不會看到它在一個var聲明中使用,而是宣告回調時:

callbackFunction(function success() { ... }, function fail() { ... }) 

你知道哪個說法是,他們標示這樣一來,如果其中一個出現故障你可以精確地指出哪一個是壞的。

+2

+1。 'a.name ===「」&& b.name ===「bar」'。 – Prasanth

+3

另一個原因是遞歸調用函數。 – bfavaretto

6
var b = function bar(){ 
    return 3; 
} 
bar() 
=> bar is not defined 

標識符baravailable inside of the function。嘗試

var b = function bar() { 
    console.log(bar); 
} 
b(); 

爲什麼人會使用一個命名函數表達式?

要允許引用未分配給可達或常量變量的函數表達式,例如在IEFE遞歸。

另外,在調試過程中,命名函數顯示不同。在調用堆棧(trace)或斷點列表中。通常您可以使用(命名)函數聲明而不是函數表達式,另請參閱http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html

相關問題