匿名函數的基本形式是(function(){...}) ();
前括號包含函數體,後括號是將參數傳遞給匿名函數並立即執行。
匿名函數的作用是避免全局變量的汙染和函數名的沖突。
每當妳讀代碼的時候,妳必須註意匿名函數。有時它們被稱為lambda,有時它們是匿名函數。反正我覺得他們不好用。
如果妳不知道什麽是匿名函數,這裏有壹句名言:
匿名函數是在運行時動態聲明的函數。它們被稱為匿名函數,因為與普通函數不同,它們沒有函數名。—海倫·愛默生,Helephant.com
匿名函數的形式如下:
函數(){...密碼...}
運籌學
(args)= & gt;{ ...密碼..}
我試圖讓妳明白,匿名函數通常只在絕對必要的時候使用。匿名函數不應該是首選,應該在原因已知的情況下使用。當妳理解了這個想法,妳的代碼會變得更簡潔,更容易維護,更容易追蹤bug。讓我們從避免匿名函數的三個原因開始:
當妳寫代碼的時候,無論妳多麽擅長打代碼,妳總會遇到錯誤。有時候,這些錯誤很容易被發現,有時候卻不容易。
如果妳知道這些錯誤來自哪裏,就很容易被發現。為了找出錯誤,我們使用這個叫做堆棧跟蹤的工具。如果妳不知道堆棧跟蹤,goole給出了壹個很好的介紹。
假設現在有壹個非常簡單的項目:
函數start () {
(函數middle () {
(函數end () {
console . LG(' test ');
})()
})()
}
上面的代碼中有壹個非常愚蠢的錯誤,拼寫錯誤(console.log)。這個拼寫錯誤在小項目中不是大問題。
如果這是壹個包含許多模塊的非常大的項目的壹小部分,問題就大了。假設妳沒有犯這個愚蠢的錯誤,新來的初級工程師會在休假前把這個錯誤提交給代碼庫!
現在,我們必須追蹤它。使用我們的名副其實的函數,我們得到下面的堆棧跟蹤:
感謝各位初級開發者給自己的函數命名!現在我們可以很容易地跟蹤這個錯誤。
但是..壹旦我們解決了這個問題,我們就會發現另壹個bug。這次是由壹個更有經驗的開發者介紹的。這個人認識蘭達斯
結果他們偶然發現了壹個bug,我們的工作就是追查。
代碼如下:
(函數(){
(函數(){
(函數(){
console . LG(' test ');
})();
})();
})();
毫不奇怪,開發者也忘記了如何拼寫console.log!真巧!不幸的是,他們沒有命名他們的功能。
那麽控制臺會輸出什麽呢?
好吧,至少我們有壹個電話號碼,對吧?在這個例子中,我們似乎有大約7行代碼。如果我們處理壹大段代碼呢?比如壹萬行代碼?行號跨度這麽大怎麽辦?如果代碼折疊後有代碼映射文件,渲染行號是不是根本沒用?
我覺得這些問題的答案都挺簡單的,答案就是:整天想著它們會讓妳心臟特別不好。
可讀性
咦,聽說妳還不信。妳還舍不得妳的匿名功能,從來沒有出過bug。那我得向妳道歉。妳認為妳的代碼是完美的。讓我們看看這個!
請看下面兩段代碼:
函數initiate(參數){
返回新承諾((解決,拒絕)= & gt{
嘗試{
if(參數){
返回resolve(true);
}
return resolve(false);
} catch (e) {
拒絕(e);
}
});
}
啟動(真)
。然後(res = & gt{
if (res) {
doSomethingElse();
}否則{
do something();
}
).catch(e = & gt;{
日誌錯誤(電子郵件);
restartApp();
}
);
這是壹個很不正常的例子,但我相信妳已經明白了我要說的話。我們的方法返回壹個承諾,我們使用這個承諾對象/方法來處理不同的可能響應。
妳可能覺得幾段代碼不難讀,但是我覺得可以更好!
如果我們刪除所有匿名函數會怎麽樣?
函數initiate(參數){
返回新的承諾(檢查參數);
}
參數的功能檢查(解決、拒絕){
嘗試{
if(參數){
返回resolve(true);
}
return resolve(false);
} catch (e) {
拒絕(e);
}
}
函數賦值器(res) {
if (res) {
doSomethingElse();
}否則{
do something();
}
}
函數句柄錯誤(e) {
日誌錯誤(電子郵件);
restartApp();
}
啟動(真)
。然後(評估者)
。catch(handle error);
好吧,我們明確壹點:這部分代碼比較長,但是我認為它不僅可讀性更好!我們精心命名的函數不同於匿名函數,只要我們壹看到它們的名字就知道它們的功能是什麽。這避免了評估代碼的障礙。
這也有助於區分關系。與創建壹個方法、傳遞它、然後運行邏輯不同,在第二個示例中,參數被賦予then,catch只是指向所有事情發生的函數。
我沒有什麽可以讓妳相信更易讀。但是如果妳不相信,我可以試試最後壹個論點。
相信看完這個案例,妳已經掌握了方法。更多精彩請關註Gxl上其他相關文章!
推薦閱讀: