2015-02-24 80 views
1

A.函數foo(){}命名函數聲明有什麼好處嗎?

B.無功富=函數foo(){}

我寫在A時尚我所有的JavaScript函數,因爲我覺得B是多餘的。我的同事喜歡進去做羣發查找/替換來重寫B的功能,因爲他說這是根據airbnb的最佳做法。

  1. 這兩者之間的根本/實際區別是什麼?

  2. 是否有危險讓他破壞我的代碼?

  3. 是一個比另一個更好的做法(你可以引用任何來源)?


+2

你看過這個嗎? http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname – dowomenfart 2015-02-24 13:14:01

+0

[你更好](http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html) 。你可以鏈接你的同事聲稱要遵循的那些「airbnb最佳實踐」嗎? – Bergi 2015-02-24 13:16:25

+0

沒有更好的了。這完全取決於情況。 – 2015-02-24 13:18:04

回答

4

序言:你的是被稱爲函數聲明。他被稱爲命名函數表達式(NFE)。這些都是在一些細節中this question and its answers討論,但解決您的具體問題:

......他說,這是根據製作的Airbnb最佳實踐...

如果他在談論these Airbnb style guidelines,我不沒有看到任何支持這一說法的東西。我確實看到了一些可能的東西誤讀那樣,但它會誤讀。它說,不申報內部控制的流程框的功能,例如:

// bad 
if (currentUser) { 
    function test() { 
    console.log('Nope.'); 
    } 
} 

而這很正確,這不只是壞,它根據目前的規定是無效的。您只能在範圍的頂層聲明函數(例如,在全局範圍之外的所有控制流結構之外,如if,whilefor等;或位於所有控制流結構之外的函數的頂層) 。上面的示例無效,因爲它位於與if連接的塊內。 (在ES6,只有Web引擎,它在的情況下  — TL一個非常具體的子集tolerated; DR:不要做

但是,這不是一個毯子「不使用功能減少「,而不是遠程。

這兩者之間的根本/實際區別是什麼?

你的形式在進入其中函數被聲明的範圍內,在執行任何步驟一步代碼之前(有時這被稱爲「起重」)處理。他的表單執行後面,當在代碼的分步執行中遇到函數表達式時。

是否有危險讓他破壞我的代碼?

是的,這方面的工作代碼:

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

...將打破,如果改寫爲:

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

...因爲函數聲明提升消失(var提升仍然是那麼當您嘗試調用它時,foo變量的值爲undefined

另外,某些瀏覽器得到NFEs 錯誤,創建two functions instead of one。例如,IE8的功能與舊版本的Safari一樣。我知道的所有現代瀏覽器都可以讓它們正確(現在)。

最後,他重寫代碼以依靠自動分號插入的恐怖(要正確地重寫它,他需要在函數體後添加;)。 ASI不完美。依靠它也傳統上搞砸了minifiers,雖然現在大多數minifiers處理正確(因爲技術上,不處理它是在縮小器中的錯誤)。

是一個比另一個更好的做法(你能引用任何來源)?

這是見仁見智的主觀的問題,除了上面提出的實際問題等(斷裂而去除吊裝,並NFEs)。

+2

分享一些主觀意見:函數聲明更短,更少冗餘,更獨特。 – Bergi 2015-02-24 13:30:13

+0

@Bergi:恩說。 – 2015-02-24 13:33:11

+0

所以剛剛向我透露,使用B的動機是讓你可以用以下方式鏈接你的函數和變量。我從來沒有寫過這樣的代碼。這是一個已知的方法嗎? http://jsfiddle.net/s0vva8dm/1/ – 2015-02-24 17:08:23

相關問題