A.函數foo(){}命名函數聲明有什麼好處嗎?
B.無功富=函數foo(){}
我寫在A時尚我所有的JavaScript函數,因爲我覺得B是多餘的。我的同事喜歡進去做羣發查找/替換來重寫B的功能,因爲他說這是根據airbnb的最佳做法。
這兩者之間的根本/實際區別是什麼?
是否有危險讓他破壞我的代碼?
是一個比另一個更好的做法(你可以引用任何來源)?
A.函數foo(){}命名函數聲明有什麼好處嗎?
B.無功富=函數foo(){}
我寫在A時尚我所有的JavaScript函數,因爲我覺得B是多餘的。我的同事喜歡進去做羣發查找/替換來重寫B的功能,因爲他說這是根據airbnb的最佳做法。
這兩者之間的根本/實際區別是什麼?
是否有危險讓他破壞我的代碼?
是一個比另一個更好的做法(你可以引用任何來源)?
序言:你的是被稱爲函數聲明。他被稱爲命名函數表達式(NFE)。這些都是在一些細節中this question and its answers討論,但解決您的具體問題:
......他說,這是根據製作的Airbnb最佳實踐...
如果他在談論these Airbnb style guidelines,我不沒有看到任何支持這一說法的東西。我確實看到了一些可能的東西誤讀那樣,但它會誤讀。它說,不申報內部控制的流程框的功能,例如:
// bad
if (currentUser) {
function test() {
console.log('Nope.');
}
}
而這很正確,這不只是壞,它根據目前的規定是無效的。您只能在範圍的頂層聲明函數(例如,在全局範圍之外的所有控制流結構之外,如if
,while
,for
等;或位於所有控制流結構之外的函數的頂層) 。上面的示例無效,因爲它位於與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)。
分享一些主觀意見:函數聲明更短,更少冗餘,更獨特。 – Bergi 2015-02-24 13:30:13
@Bergi:恩說。 – 2015-02-24 13:33:11
所以剛剛向我透露,使用B的動機是讓你可以用以下方式鏈接你的函數和變量。我從來沒有寫過這樣的代碼。這是一個已知的方法嗎? http://jsfiddle.net/s0vva8dm/1/ – 2015-02-24 17:08:23
你看過這個嗎? http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname – dowomenfart 2015-02-24 13:14:01
[你更好](http://blog.niftysnippets.org/2010/03/anonymouses-anonymous.html) 。你可以鏈接你的同事聲稱要遵循的那些「airbnb最佳實踐」嗎? – Bergi 2015-02-24 13:16:25
沒有更好的了。這完全取決於情況。 – 2015-02-24 13:18:04