2014-01-29 116 views
2
var a = function(){return true;} 
var a = function abc(){return true;} 

誰能給我解釋一下這兩者之間的區別是?兩個不同的匿名函數聲明之間的區別?

+0

的可能重複的[VAR functionName =函數(){} VS功能使用functionName(){}](HTTP://計算器.COM /問題/ 33 6859/var-functionname-function-vs-function-functionname) – matth

+0

這些函數中只有一個是匿名的。另一個是名爲**的函數,稱爲'abc'。 – pete

+0

這是*不*這個問題的副本(雖然我相信這是一個重複的),如*的*兩者的形式這裏有'FunctionExpressions' - 一個只是有一個名字。 – user2864740

回答

4

的這裏不同的是,這裏

var a = function abc(){return true;} 

您命名一個匿名函數。該名稱abc僅適用於該功能的內部範圍。

UPDATE

儘管一些實現不尊重該公約......不要指望IE8與它的工作這是真的......

+1

至少,它應該是這樣......一些實現搞砸然而:( – Cu3PO42

2

第二個功能是命名函數表達式。它對於遞歸可能是有用的,例如

// named 
var a = function abc(v) { console.log(v); return v>1 && abc(v-1) || v;} 
//             ^name abc is known 
    ,b = a 
a(3); //=> 3,2,1 
b(4); //=> 4,3,2,1 
a = function (v) {console.log('value = '+ v);}; 
b(3); //=> 3,2,1 

// versus 
var a = function (v) { console.log(v); return v>1 && a(v-1) || v;} 
//             ^using a here 
    ,b = a 
a(3); //=> 3,2,1 
b(4); //=> 4,3,2,1 
a = function (v) {console.log('value = '+ v);}; 
b(3); //=> 'value = 3' 
+0

注意,使用命名函數表達式是沒有必要的遞歸 - 因爲'了'是在內部功能的範圍內都有效,你可以在你的例子中做'a(v-1)'。 – OverlappingElvis

+0

@OverlappingElvis:但請注意,這與函數的不同引用一起工作,在本例中爲'b'引用。即使原來的'a'引用被覆蓋,這種技術仍然可以繼續工作,而如果你在'a'上再次出現問題,它會崩潰。 –

+0

@ScottSauyet謝謝,我想解釋它,但你更快。 – KooiInc

3

的你的例子都只是函數表達式 - 也就是說,你要指定一個表達式(這恰好是一個函數)給一個變量。區別在於一個是匿名的,另一個是所謂的「命名函數表達式」。 http://kangax.github.io/nfe/對函數聲明,表達式和命名錶達式之間的區別有很好的概述。簡短的版本:

  • 這些東西是,在大多數情況下,互換在很多情況下
  • 如果你做了很多的調試,已經命名,而不是匿名函數可以讓你的調用棧更易於閱讀
  • 然而,存在在涉及使用命名的函數的一定的JavaScript實現中的錯誤表達式
+0

只需添加到您的答案中,我發現對於較大的項目,爲調試目的命名該函數(第二行)很方便(如果出現錯誤,Chrome控制檯將顯示名稱),但隨後會有一個縮小器/清理工通過並去除生產版本的名稱。 – samanime

+0

好點 - 通過刪除函數名稱在縮小時不應該丟失任何東西。 – OverlappingElvis