国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

不使用JS匿名函數(shù)的三個(gè)理由

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

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

[[214508]]

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

匿名函數(shù)是一種在運(yùn)行時(shí)動(dòng)態(tài)聲明的函數(shù)。它們之所以被稱為匿名函數(shù)是因?yàn)椴煌谄胀ê瘮?shù),它們并沒有函數(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è)理由開始:

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

如果你知道這些錯(cuò)誤來自哪里,那么錯(cuò)誤會(huì)很容易被查出來。為了容易查出錯(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.   })() 

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

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

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

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

下面是代碼: 

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

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

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

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

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

可讀性

咦,我聽說你還不信。你仍舊對(duì)你的匿名函數(shù)戀戀不舍,并且還從未發(fā)生過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)明白我要說什么了。我們反悔了一個(gè)promise方法,我們用這個(gè)promise對(duì)象/方法處理不同的響應(yīng)。

你也許會(huì)認(rèn)為幾段代碼讀起來并不難,但我認(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)于更具有可讀性,我沒有什么再能說服你的了。但是也許你還沒被說服的話,我可以試一下***的論據(jù)。

可重用性

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

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

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

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

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

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

  1. const stuff = [  
  2.   { hide: truename'justin' },  
  3.   { hide: falsename'lauren' }, 
  4.   { hide: falsename'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); 

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

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

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

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

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

責(zé)任編輯:未麗燕 來源: 開源中國(guó)翻譯
相關(guān)推薦

2012-11-21 10:01:35

RubyWeb

2021-11-17 10:38:22

邊緣計(jì)算云端

2021-06-16 12:53:57

Java編程語(yǔ)言

2015-12-11 15:52:47

盛大云

2013-12-09 09:54:58

2020-03-07 15:25:38

TypeScript代碼開發(fā)

2010-05-13 11:45:56

MySQL數(shù)據(jù)庫(kù)

2021-01-04 20:48:19

TypeScriptJS前端

2010-06-10 10:50:17

MySQL數(shù)據(jù)庫(kù)

2011-05-18 15:40:52

MySQL

2020-01-03 16:16:15

云計(jì)算技術(shù)工具

2021-06-11 17:49:29

變量代碼計(jì)算機(jī)

2011-03-02 13:54:39

MySQL數(shù)據(jù)庫(kù)

2009-08-08 08:47:07

Windows 7新特性

2009-09-10 08:32:14

Windows 7企業(yè)升級(jí)寶馬

2013-04-01 09:20:05

JavaScript

2020-01-10 11:13:23

人工智能大數(shù)據(jù)IT

2023-04-26 11:14:11

IT領(lǐng)導(dǎo)者遠(yuǎn)程工作

2015-06-23 09:10:04

Spark主機(jī)托管云平臺(tái)

2009-08-06 11:00:19

C#對(duì)象的使用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

97se亚洲国产综合自在线不卡 | 成人a视频在线| 亚洲精品小说| 国产一区二区日韩| 粉嫩粉嫩芽的虎白女18在线视频| 国产成人精品aa毛片| 亚洲一区二区三区香蕉| 婷婷激情成人| 精品国产乱码久久久久久夜甘婷婷 | 最新国产精品| 国模私拍一区二区三区| av电影在线地址| 日本久久电影网| 啊啊啊啊啊好爽| 99久久精品费精品国产一区二区| 久久久久久草| 欧美69视频| 国产精品久久久久久久久久久不卡| 亚洲欧洲专区| 亚洲欧美日韩网| 18加网站在线| 欧美日韩视频在线一区二区| 又黄又www| 亚洲色图欧美在线| aⅴ在线免费观看| 成人综合婷婷国产精品久久免费| 任我爽在线视频精品一| 亚洲美女91| 99re在线观看| 欧美国产激情| 91欧美精品午夜性色福利在线 | 阿v视频在线| 91精品一区二区三区在线观看| 亚洲做受高潮| 亚洲成av人片一区二区三区| 久久撸在线视频| 久久久精品人体av艺术| 欧美牲交a欧美牲交| 精品亚洲成a人在线观看| 欧美一区二区三区四区五区六区| 亚洲国产三级| 欧美日韩综合久久| 视频一区在线视频| 亚洲va韩国va欧美va精四季| 人人狠狠综合久久亚洲| 秋霞在线观看一区二区三区| 日韩精品一二三四| 黄色一级片av| eeuss影院一区二区三区| 精品少妇在线视频| 久久综合色一综合色88| 免费观看成人在线视频| 国产精品久久二区二区| 日本不卡1区2区3区| 五月激情丁香一区二区三区| 国产黄色免费在线观看| 91精品免费在线观看| japanese色国产在线看视频| 亚洲欧美日韩图片| 精品午夜av| 国产成人涩涩涩视频在线观看| 日韩国产在线| 国产一区二区高清视频| 丝袜美腿成人在线| 亚洲 欧美 综合 另类 中字| 日本一区二区动态图| 日本性视频网| 欧美日韩电影一区| 亚洲精品日产| 久久久综合免费视频| 2023国产精品久久久精品双| 日韩国产一区久久| 久久精品亚洲国产奇米99| 人人超碰在线| 亚洲第一天堂无码专区| 免费一级欧美片在线观看网站| 2024亚洲男人天堂| 国产精品入口66mio| 欧美黄色免费网址| 夜夜亚洲天天久久| 肉体视频在线| 欧美成人激情图片网| 婷婷综合久久| www.激情网| 亚洲v精品v日韩v欧美v专区| xxxx视频在线| 日本在线观看天堂男亚洲| 午夜亚洲一区| 黄色片视频在线| 日韩一级高清毛片| 免费福利视频一区| 精品一区二区久久久久久久网站| www.日韩av| 九色在线视频蝌蚪| 俺去亚洲欧洲欧美日韩| 久久精品欧美一区| 精品国偷自产一区二区三区| 精品成人av一区| 国产精品久久久久久久久免费高清 | 激情六月婷婷综合| 天天射综合网站| 日本高清无吗v一区| 亚洲永久av| 成人性生交xxxxx网站| 亚洲久久成人| r级无码视频在线观看| 亚洲国产精品视频| av成人免费| 亚洲自拍偷拍视频| 久久精品视频一区| 51精品在线| 亚洲自拍偷拍第一页| 久久婷婷色综合| 韩国福利在线| 欧美丰满熟妇bbbbbb百度| 午夜在线视频观看日韩17c| 久久久久久久久久福利| 337p亚洲精品色噜噜噜| 99精品在免费线中文字幕网站一区| 欧美日韩国产综合视频 | 免费a级人成a大片在线观看| 忘忧草在线日韩www影院| 欧美人与性动交| av成人天堂| 成人xxx免费视频播放| 日韩激情视频在线| 欧美日韩视频| 国产99re| 日韩中文av在线| 韩国三级电影一区二区| 免费黄色在线网站| 国产精品丝袜久久久久久不卡| 91女神在线视频| 欧美a级在线观看| 精品国产免费久久久久久尖叫| 一区二区三区国产| 99精品在免费线中文字幕网站一区| japanese在线播放| 欧美xxxxx牲另类人与| 国语自产精品视频在线看8查询8| 国内av免费| 97在线免费观看视频| 国产亚洲人成网站| 91精品麻豆| 欧美日韩国产精品激情在线播放| 日韩av最新在线观看| 免费美女久久99| 福利成人导航| 色综合久久久久久久久五月| 欧美日韩成人一区二区| 亚洲特色特黄| 国产福利第一视频在线播放| 国产精品久久久久久一区二区| 1024国产精品| 婷婷精品视频| 福利视频网站| 日韩av手机在线观看| 亚洲精品日韩一| 秋霞影视一区二区三区| eeuss鲁片一区| 日韩免费黄色av| 亚洲综合男人的天堂| 日韩免费av| 精华区一区二区三区| 亚洲一区二区免费| 色94色欧美sute亚洲13| 精品99视频| 182tv在线播放| 亚洲国产婷婷香蕉久久久久久99| 欧美一级搡bbbb搡bbbb| 首页综合国产亚洲丝袜| 国产色播av在线| 日韩视频免费播放| 九九热精品视频国产| 日韩一区在线播放| 欧美伦理影院| 高清性色生活片在线观看| 欧美 日韩 国产在线| 亚洲精品动漫久久久久| 成人av网址在线| 日韩手机在线| 天堂中文在线视频| 欧美一区观看| 综合久久五月天| 亚洲丝袜制服诱惑| 手机亚洲手机国产手机日韩| 91看片在线观看| 看一级黄色录像| 久久男人av资源网站| 亚洲国产日韩在线一区模特| 欧美日韩18| 天堂在线中文网官网| 久久久久久久片| 91精品久久久久久久久久久久久久| 欧美性淫爽ww久久久久无| 久久99精品国产麻豆婷婷洗澡| 日本一区二区三区电影免费观看| 欧美黑人巨大| 亚洲一区精品视频| 97国产精品人人爽人人做|