2013-07-01 117 views
1

這些有什麼區別?Javascript:var myFunc = function()vs var myFunc = function myFunc()

var myFunc = function() { 
    // ... 
}; 

var myFunc = function myFunc() { 
    // ... 
}; 

在第二個例子,arguments.callee.caller.name作品,但不是第一個。第二種語法有什麼問題嗎?

+0

那麼......名字? –

+1

'var func = function F(){};'將使'F()'在功能塊內部可用,但不在外部。 – Passerby

+0

'arguments.callee'已棄用,因此如果您需要這種功能,請使用命名函數表達式。 – finishingmove

回答

2

在函數文本的name是可選的,如果忽略在第一種情況下,你顯示功能,據說是匿名

這是從JavaScript: The Good Parts by Douglas Crockford

甲字面函數具有四個部分。第一部分是保留字功能。可選的第二部分是函數的名稱。該函數可以使用它的名稱來遞歸地調用它自己。調試器和開發工具也可以使用該名稱來識別該功能。如果一個函數沒有給出一個名字,如前面的例子所示,它被稱爲匿名

+1

你提到了我最喜歡的書之一;謝謝。我將回顧這一部分。 – vcardillo

1

第一個功能不是一個名字。

將函數分配給變量不會給函數一個名稱。

7

第二個有一個名字,而第一個沒有。函數是具有屬性name的對象。如果該函數是匿名的,那麼它沒有名字。

var a = function(){}; // anonymous function expression 
a.name; //= empty 

var a = function foo(){}; // named function expression 
a.name; //= foo 
+0

每個的優缺點是什麼?第二種語法有什麼問題嗎? – vcardillo

+0

(除了命名的重複) – vcardillo

+0

沒有重複。第一個沒有名字。優點是您可以在遞歸函數中調用該函數,並且您可以在調用堆棧跟蹤中看到該名稱。 – elclanrs

相關問題