2013-10-03 25 views
2

考慮兩種風格的JavaScript函數聲明(出四,我認爲):混合javascript函數聲明上的樣式

function foo() { 
    // ... 
} 

var foo = function() { 
    // ... 
} 

在許多情況下,這些行爲將是相同的,和我我認爲我主要的區別在於例如這些所謂的問題:

difference-between-var-foo-function-and-function-foo

usual-functions-vs-function-variables-in-javascript

這都有答案鏈接到這個非常有用的解釋:

javascript-function-declaration-ambiguity

但我想這兩種風格在一個聲明中結合;一個短/可微型局部變量名稱(因爲我經常需要參考它)和一個描述性名稱(我想從.name中得到一些友好的東西)。

這是我困惑的地方。這是因爲如果立即將該函數分配給一個變量的法案留給它以自己的名義未定義:

var f = function foo() { 
    // ... 
}; 
console.log(f.name); // "foo" 
console.log(foo.name); // !? error: foo is not defined ?! 

因此,要獲得這樣一個問題:爲什麼這不是工作?或者,更可能的是,我仍然可能會誤解這兩種聲明風格?

注意的是,以下的不將導致錯誤:

var f = foo; 
function foo() { 
    // ... 
} 
console.log(f.name); // "foo" 
console.log(foo.name); // "foo" 

如何,究竟是有何不同?

PS:我覺得這是這個SO問題不同:

in-javascript-what-is-the-motivation-or-advantage-of-using-var-foo-function-f...

這是我的困境,其中變量名和函數名是相同的特殊情況,即

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

回答

2

當你寫

var f = function foo() { ... } 

foo的範圍只是函數的體,不是的封閉函數。這主要用於創建匿名遞歸函數。

whats the difference between function foo(){} and foo = function(){}?

建議不要使用符號,因爲他們沒有在一些實現正常工作。

+0

那很快,謝謝!那麼你是說,當一個函數的「適當」名稱的範圍在賦值中作爲右值而不是作爲單獨的語句出現時(請參閱下面的錯誤代碼) –

+0

這是函數表達式和一個函數聲明。 – Barmar

+0

根據規範,它對封閉範圍有不同的影響。你的鏈接中的答案是有幫助的,再次感謝......我應該更廣泛地搜索。 –

1

這就是我所看到的。 javascript中的每個函數都繼承自Function對象,而Function對象具有屬性.name。

這產生與在全局空間中的名稱FOO中的功能對象:

function foo(){} 

這創建本地匿名(因此沒有名稱)功能,並指定是哪個住在全局空間中的變量f:

var f = function(){} 

此創建函數對象並將其賦值給變量,它並沒有在全球範圍內的存在,只有本地男,同上,但指定的名稱FOO:

var f = function foo(){} 

編輯:爲更好的畫面考慮以下

(function foo(){console.log("executing foo")})(); 
(function(){console.log("executing anonymous")})(); 

都是函數(對象)在全球範圍內 - 先用名,第二沒有名字。如果它們是在變量中創建的,則它的作用相同,只是上下文不同。