不使用JS匿名函數(shù)理由

匿名函數(shù)的基本形式為(function(){...})();

10年積累的做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有洪江管理區(qū)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

前面的括號(hào)包含函數(shù)體,后面的括號(hào)就是給匿名函數(shù)傳遞參數(shù)并立即執(zhí)行之

匿名函數(shù)的作用是避免全局變量的污染以及函數(shù)名的沖突

無(wú)論你在什么時(shí)候讀代碼,您都必須注意到匿名函數(shù)。有時(shí)它們被稱為 lambda,有時(shí)是匿名函數(shù),不管怎樣,我認(rèn)為他們是不好使用的。

如果你不知道匿名函數(shù)是什么,這里有一個(gè)引語(yǔ):

匿名函數(shù)是一種在運(yùn)行時(shí)動(dòng)態(tài)聲明的函數(shù)。它們之所以被稱為匿名函數(shù)是因?yàn)椴煌谄胀ê瘮?shù),它們并沒有函數(shù)名 。 — Helen Emerson, Helephant.com

匿名函數(shù)形式如下:

function () { ... code ... }
OR
(args) => { ... code .. }

我今天嘗試讓大家理解通常情況下只有在絕對(duì)需要的情況下才使用匿名函數(shù)的想法。匿名函數(shù)不應(yīng)該是首選,而且應(yīng)該知道原因情況下使用。當(dāng)理解這種想法之后,你的代碼會(huì)變得更簡(jiǎn)潔,更容易維護(hù),并且更容易跟蹤bug。先從避免使用匿名函數(shù)的三個(gè)理由開始:

你寫代碼的時(shí)候, 無(wú)論你多么擅長(zhǎng)敲代碼, 總是會(huì)碰到錯(cuò)誤。有時(shí)候,這些錯(cuò)誤很容易被查出,有時(shí)候并不容易。

如果你知道這些錯(cuò)誤來(lái)自哪里,那么錯(cuò)誤很容易會(huì)被查出來(lái)。為了查出錯(cuò)誤,我們使用這個(gè)被叫做堆棧軌跡的工具。如果你不了解 堆棧軌跡 ,goole給出了很棒的介紹。

假設(shè)現(xiàn)在有一個(gè)非常簡(jiǎn)單的工程:

function start () {
 (function middle () {
 (function end () {
  console.lg('test');
 })()
 })()
}

上面代碼里面有一個(gè)非常愚蠢的錯(cuò)誤,拼寫錯(cuò)誤(console.log)。在小工程里面,這個(gè)拼寫錯(cuò)誤不是什么大問(wèn)題。 如果這是一個(gè)有非常多模塊非常大的工程的一小段,問(wèn)題就大了。假設(shè)這個(gè)愚蠢的錯(cuò)誤不是你犯的,那么新來(lái)的初級(jí)工程師將會(huì)在他休假之前把這個(gè)錯(cuò)誤提交到代碼庫(kù)!

現(xiàn)在,我們必須追查。 使用我們精心命名的函數(shù), 我們得到如下的堆棧跟蹤:

謝謝你命名你的函數(shù) ,初級(jí)開發(fā)者們! 現(xiàn)在我們可以輕松地追蹤到這個(gè)bug。

但是..一旦我們解決了這個(gè)問(wèn)題, 就會(huì)發(fā)現(xiàn) 還有另一個(gè)bug。 這次是一位更資深的開發(fā)人員介紹的。這個(gè)人知道 lambdas
結(jié)果他們偶然發(fā)現(xiàn)了一個(gè)bug,我們的工作就是追蹤它。

下面是代碼:

(function () {
 (function () {
 (function () {
  console.lg('test');
 })();
 })();
})();

吃不吃驚,這名開發(fā)者也忘記了如何拼寫console.log了!這也太巧合了吧!令人感到遺憾的是,他們都沒有命名他們的函數(shù)。

那么控制臺(tái)會(huì)輸出什么呢?

好吧,我們至少還有行號(hào),對(duì)吧?在這個(gè)例子中,看起來(lái)我們有大約7行代碼。如果我們處理一大段代碼會(huì)如何呢?比如一萬(wàn)行代碼?行號(hào)的跨度如此之大該怎么辦呢?如果代碼被折疊后有沒有一個(gè)代碼地圖文件,那么對(duì)行號(hào)的渲染是不是根本就是沒有什么用了呢?

我想對(duì)這些問(wèn)題的回答相當(dāng)簡(jiǎn)單,答案就是:想這些會(huì)讓你一整天都會(huì)過(guò)的相當(dāng)糟心。

可讀性

咦,我聽說(shuō)你還不信。你仍舊對(duì)你的匿名函數(shù)戀戀不舍,并且還從未發(fā)生過(guò)bug。那么我得向你道歉,你認(rèn)為你的代碼是完美的。讓我們看看這個(gè)!

看看下面兩段代碼:

function initiate (arguments) {
 return new Promise((resolve, reject) => {
 try {
  if (arguments) {
   return resolve(true);
  }
  return resolve(false);
 } catch (e) {
  reject(e);
 }
 });
}
initiate(true)
 .then(res => {
  if (res) {
   doSomethingElse();
  } else {
   doSomething();
  }
 ).catch(e => {
   logError(e.message);
   restartApp();
   }
 );

這是一個(gè)非常不正常的例子,但是我相信你已經(jīng)明白我要說(shuō)什么 了。我們的方法返回了一個(gè)promise,我們用這個(gè)promise對(duì)象/方法處理不同可能的 響應(yīng)。

你也許會(huì)認(rèn)為幾段代碼讀起來(lái)并不難,但我認(rèn)為它們可以變得更好!

如果我們?nèi)サ羲械哪涿瘮?shù)會(huì)怎樣呢?

function initiate (arguments) {
 return new Promise(checkForArguments);
}
function checkForArguments (resolve, reject) {
 try {
 if (arguments) {
  return resolve(true); 
 }
 return resolve(false);
 } catch (e) {
 reject(e);
 }
}
function evaluateRes (res) {
 if (res) {
 doSomethingElse();
 } else {
 doSomething();
 }
}
function handleError (e) {
 logError(e.message);
 restartApp();
}
initiate(true)
 .then(evaluateRes)
 .catch(handleError);

好,先講清楚:這部分代碼更長(zhǎng),但我認(rèn)為其不僅僅是有更多的可讀性!我們精心命名的函數(shù)與匿名函數(shù)不一樣,只要我們一看到它們的名字就知道它們的功能是什么。這避免了在評(píng)估代碼時(shí)的障礙。

這也有助于分清楚其中的關(guān)系。與創(chuàng)建一個(gè)方法、將其傳遞、然后運(yùn)行邏輯不同,在第二個(gè)例子中的參數(shù)被給到了then,catch只是指向了發(fā)生所有事情的函數(shù)。

關(guān)于更具有可讀性,我沒有什么再能說(shuō)服你的了。但是也許你還沒被說(shuō)服的話,我可以試一下最后的論據(jù)。

總結(jié)

以上所述是小編給大家介紹的不使用 JS 匿名函數(shù)的理由,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!

網(wǎng)頁(yè)題目:不使用JS匿名函數(shù)理由
網(wǎng)站路徑:http://bm7419.com/article18/jjcggp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)App設(shè)計(jì)、定制開發(fā)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)