日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
不使用JS匿名函數(shù)的三個(gè)理由

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

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),青云譜企業(yè)網(wǎng)站建設(shè),青云譜品牌網(wǎng)站建設(shè),網(wǎng)站定制,青云譜網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,青云譜網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

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

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

 
 
 
  1. function () { ... code ... }
  2. OR
  3. (args) => { ... code .. }

今天我嘗試讓大家理解只有在絕對(duì)需要的情況下才使用匿名函數(shù)的想法。匿名函數(shù)不應(yīng)該是***,而且你自己也應(yīng)該知道為什么使用它。當(dāng)理解這種想法之后,你的代碼會(huì)變得更簡(jiǎn)潔,更容易維護(hù),并且更容易跟蹤bug。

先從避免使用匿名函數(shù)的三個(gè)理由開(kāi)始:

無(wú)論你多么擅長(zhǎng)寫(xiě)代碼,出現(xiàn)錯(cuò)誤也是不可避免的。有時(shí)候,這些錯(cuò)誤很容易被查出,有時(shí)候并不容易。

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

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

 
 
 
  1. function start () {
  2.  (function middle () {
  3.    (function end () {
  4.      console.lg('test');
  5.     })()
  6.   })()
  7. }

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

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

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

但是..一旦我們解決了這個(gè)問(wèn)題,就會(huì)發(fā)現(xiàn)還有另一個(gè)bug。 這次是一位更資深的開(kāi)發(fā)人員介紹的。這個(gè)人知道lambdas(匿名函數(shù)),并在代碼中大量使用它們。 結(jié)果他們偶然發(fā)現(xiàn)了一個(gè)bug,我們的工作就是追蹤它。

下面是代碼:

 
 
 
  1. (function () {
  2.  (function () {
  3.    (function () {
  4.      console.lg('test');
  5.     })();
  6.   })();
  7. })();

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

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

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

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

可讀性

咦,我聽(tīng)說(shuō)你還不信。你仍舊對(duì)你的匿名函數(shù)戀戀不舍,并且還從未發(fā)生過(guò)bug。我的錯(cuò),你的代碼是完整的。但是讓我們看看這個(gè)!

看看下面兩段代碼:

 
 
 
  1. function initiate (arguments) {
  2.   return new Promise((resolve, reject) => {
  3.     try {
  4.       if (arguments) {
  5.          return resolve(true);
  6.       }
  7.       return resolve(false);
  8.     } catch (e) {
  9.       reject(e);
  10.     }
  11.   });
  12. }
  13. initiate(true)
  14.   .then(res => {
  15.         if (res) {
  16.           doSomethingElse();
  17.         } else {
  18.           doSomething();
  19.         }
  20.   ).catch(e => {
  21.             logError(e.message);
  22.             restartApp();
  23.           }
  24.   );

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

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

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

 
 
 
  1. function initiate (arguments) {
  2.   return new Promise(checkForArguments);
  3. }
  4. function checkForArguments (resolve, reject) {
  5.   try {
  6.     if (arguments) {
  7.      return resolve(true);   
  8.     }
  9.     return resolve(false);
  10.   } catch (e) {
  11.     reject(e);
  12.   }
  13. }
  14. function evaluateRes (res) {
  15.   if (res) {
  16.     doSomethingElse();
  17.   } else {
  18.     doSomething();
  19.   }
  20. }
  21. function handleError (e) {
  22.   logError(e.message);
  23.   restartApp();
  24. }
  25. initiate(true)
  26.   .then(evaluateRes)
  27.   .catch(handleError);

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

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

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

可重用性

你注意到上一個(gè)例子了嗎?上個(gè)例子中的函數(shù)的使用范圍從參數(shù)和初始化函數(shù),變?yōu)樽屗泻瘮?shù)都能使用。

當(dāng)你使用匿名函數(shù)時(shí)這些函數(shù)很難在你的應(yīng)用程序內(nèi)重復(fù)使用。

可重用性將不復(fù)存在,最終你會(huì)一遍又一遍地寫(xiě)重復(fù)的代碼。正如我們所見(jiàn)的,代碼寫(xiě)的越少引入的Bug就越少,用戶(hù)必須加載的內(nèi)容就越少。所有人都會(huì)因此獲益!

相反的,命名函數(shù)可以全局使用,而不需要像變量一樣到處傳遞。你的代碼的可重用性會(huì)更好,

匿名函數(shù)有可取的地方嗎?

有。雖然很不愿意承認(rèn),但有時(shí)候使用匿名函數(shù)是***的選擇。

 
 
 
  1. const stuff = [ 
  2.   { hide: true, name: 'justin' }, 
  3.   { hide: false, name: 'lauren' },
  4.   { hide: false, name: 'max' },
  5. ];
  6. const filteredStuff = stuff.filter(s => !s.hide);

上邊代碼中的匿名函數(shù)s => !s.hide非常簡(jiǎn)單,即使不能在別的地方使用也不會(huì)對(duì)別人有任何影響,而且也可以在stuff.filter中顯示出堆棧調(diào)用。如果想要重用這段代碼,***重用整段代碼:

 
 
 
  1. function filterByHide (array) {
  2.   return array.filter(item => !item.hide);
  3. }

有時(shí)你想把你所有的代碼封裝到匿名函數(shù)中,以保證全局范圍不會(huì)被污染。

 
 
 
  1. (() => {
  2.  ... your code here ...
  3. })();

在??臻g中擁有一個(gè)***的匿名函數(shù)真得不會(huì)有什么錯(cuò)誤。沒(méi)有代碼重用是痛苦的,因?yàn)橥暾哪康氖潜3址椒▋?nèi)含。

我確定這會(huì)有其他好的用法,請(qǐng)?jiān)谠u(píng)論中自由分享之!

感謝閱讀,現(xiàn)在跳出這些,并停止編寫(xiě)匿名函數(shù)!


當(dāng)前標(biāo)題:不使用JS匿名函數(shù)的三個(gè)理由
轉(zhuǎn)載來(lái)源:http://www.5511xx.com/article/dpghpog.html