成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

編寫高質量箭頭函數的5個優(yōu)秀做法

新聞 前端
箭頭功能值得流行。 它的語法簡潔明了,使用詞法綁定綁定 this,它非常適合作為回調。在本文中,通過了解決學習5個最佳實踐,以便我們可以從中學習更多箭頭函數的知識,并從它身上獲得更多的好處。

[[314970]]

箭頭功能值得流行。 它的語法簡潔明了,使用詞法綁定綁定 this,它非常適合作為回調。在本文中,通過了解決學習5個最佳實踐,以便我們可以從中學習更多箭頭函數的知識,并從它身上獲得更多的好處。

1. 箭頭函數名推斷

JS 中的箭頭函數是 匿名(anonymous) 的:函數的 name 屬性是 '' 。

  1. ( number => number + 1 ).name; // => '' 

在調試會話或調用堆棧分析期間,匿名函數被標記為 anonymous 。 不幸的是, anonymous 程序不提供有關正在執(zhí)行的代碼的任何線索。

這里是執(zhí)行匿名函數的代碼的調試會話:

右邊的調用堆棧由兩個標記為 anonymous 的函數組成,我們無法從這樣的調用堆棧信息中獲得任何有用的信息。

幸運的是,函數名推斷(ES2015的功能)可以在某些條件下檢測到函數名稱。 名稱推斷的思想是JS 可以從其語法位置確定箭頭函數名稱: 從保存函數對象的變量名稱中獲取。

我們來看看函數名稱推斷的工作原理:

  1. const increaseNumber = number => number + 1
  2.  
  3. increaseNumber.name; // => 'increaseNumber' 

因為變量 increaseNumber 保存了箭頭函數,所以 JS 決定使用 increaseNumber 作為該函數的名稱。因此,箭頭函數的名稱為 'increaseNumber' 。

第1個實踐:

一個好的做法是使用函數名稱推斷來命名箭頭函數。

現在我們用使用名稱推斷的代碼檢查一個調試會話:

因為箭頭函數有名稱,所以調用堆棧提供了有關正在執(zhí)行的代碼的更多信息。

  1. handleButtonClick 
  2. gainCounter 

2.盡可能使用內聯方式

內聯函數是僅具有一個表達式的函數。 我喜歡箭頭功能,可以編寫短內聯函數。

例如,不要使用箭頭函數的長形式:

  1. const array = [123]; 
  2.  
  3. array.map((number) => {  
  4.   return number * 2
  5. }); 

當箭頭函數只有一個表達式時,可以輕松地刪除大括號 {} 和 return 語句:

  1. const array = [123]; 
  2.  
  3. array.map(number => number * 2); 

第2個實踐:

當函數只有一個表達式時,一個好的做法是使用內聯箭頭函數格式

3.胖箭頭和比較運算符

比較操作符 > 、 < 、 <= 和 >= 看起來類似于f胖箭頭 => (它定義了箭頭函數)。當在內聯箭頭函數中使用這些比較操作符時,會產生一些混淆。

例如我們定義一個使用 <= 操作符的箭頭函數

  1. const negativeToZero = number => number <= 0 ? 0 : number; 

同一行上的兩個符號 => 和 <= 的存在會引起誤解。

為了清楚地將胖箭頭與比較操作符區(qū)分開,我們可以使用圓括號:

  1. const negativeToZero = number => (number <= 0 ? 0 : number); 

第二個選項是使用更長的形式來定義箭頭函數:

  1. const negativeToZero = number => { 
  2.   return number <= 0 ? 0 : number; 
  3. }; 

這些重構消除了胖箭頭符號和比較操作符之間的混淆。

第3個實踐:

如果箭頭函數包含操作符 > 、 < 、 <= 和 >= ,一個好的做法是將表達式包裝成一對括號,或者故意使用更長的箭頭函數形式。

4.構造普通對象

在內聯箭頭函數中使用對象字面量會觸發(fā)語法錯誤:

  1. const array = [123]; 
  2.  
  3. // throws SyntaxError! 
  4. array.map(number => { 'number': number }); 

JS 認為花括號是代碼塊,而不是對象文字。

將對象字面量加上一對括號即可解決此問題:

  1. const array = [123]; 
  2.  
  3. // Works! 
  4. array.map(number => ({ 'number': number })); 

如果對象字面量有很多屬性,我們可以使用換行,同時仍然保持箭頭函數內聯

  1. const array = [123]; 
  2.  
  3. // Works! 
  4. array.map(number => ({ 
  5.   'number': number 
  6.   'propA''value A'
  7.   'propB''value B' 
  8. })); 

第4個實踐:

在內聯箭頭函數中使用對象時,把改對象包裝在一對括號中。

5.注意過多的嵌套

箭頭函數的語法很短,很好。 但是,副作用是,當許多箭頭函數嵌套時,它可能是晦澀難懂。

我們考慮以下情況。 單擊按鈕后,啟動對服務器的請求,響應準備就緒后,將各項記錄到控制臺:

  1. myButton.addEventListener('click', () => { 
  2.   fetch('/items.json'
  3.     .then(response => response.json()); 
  4.     .then(json => { 
  5.       json.forEach(item => { 
  6.         console.log(item.name); 
  7.       }); 
  8.     }); 
  9. }); 

這里有三層箭頭函數的嵌套,需要花時間和精力來了解代碼的作用。

為了提高嵌套函數的可讀性,第一種方法是引入每個包含箭頭函數的變量,該變量應簡明地描述函數的功能。

  1. const readItemsJson = json => { 
  2.   json.forEach(item => console.log(item.name)); 
  3. }; 
  4.  
  5. const handleButtonClick = () => { 
  6.   fetch('/items.json'
  7.     .then(response => response.json()); 
  8.     .then(readItemsJson); 
  9. }; 
  10.  
  11. myButton.addEventListener('click', handleButtonClick); 

重構將箭頭函數提取到變量 readItemsJson 和 handleButtonClick 中。 嵌套級別從3減少到2。現在,我們可以更輕松地了解腳本的功能。

更好的是,可以使用 async/await 語法重構整個函數,這是解決函數嵌套的一個很好的方法:

  1. const handleButtonClick = async () => { 
  2.   const response = await fetch('/items.json'); 
  3.   const json = await response.json(); 
  4.   json.forEach(item => console.log(item.name)); 
  5. }; 
  6.  
  7. myButton.addEventListener('click', handleButtonClick); 

第5個實踐:

避免箭頭函數過多的嵌套,好的做法是通過將箭頭函數提取為獨立函數,或者盡可能使用 async/await 語法。

6. 總結

JS中的箭頭函數是匿名的。為了使調試更高效,一個好的實踐是使用變量來保存箭頭函數,這允許JS 推斷函數名。

當函數主體具有一個表達式時,嵌入式箭頭函數非常方便。

操作符 > 、 < 、 <= 和>=看起來類似于胖箭頭 => ,在內聯箭頭函數中使用這些操作符時必須小心。

對象字面量語法 {prop:'value'} 與代碼塊 {} 相似。 因此,當將對象字面量放置在嵌入式箭頭函數中時,需要將其包裝在一對括號中: ()=>({prop:'value'}) 。

最后,函數的過度嵌套模糊了代碼意圖。減少箭頭函數嵌套的一個好方法是將它們提取到變量中。或者,嘗試使用更好的特性,如 async/await 語法。

對于箭頭函數,你還有什么建議,歡迎留言討論。

代碼部署后可能存在的BUG沒法實時知道,事后為了解決這些BUG,花了大量的時間進行l(wèi)og 調試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具 Fundebug 。

原文: https://dmitripavlutin.com/ja...

 

責任編輯:張燕妮 來源: segmentfault.com
相關推薦

2020-02-14 09:39:40

箭頭函數語法運算符

2021-01-04 08:04:51

JS 變量JavaScript

2023-07-06 14:51:30

開發(fā)高質量軟件

2012-09-13 10:44:18

Python代碼

2011-03-04 10:11:09

JavascriptAPI

2020-03-12 14:03:59

工具代碼開發(fā)

2015-08-25 08:42:36

高質量代碼命名

2015-08-25 08:29:11

編寫高質量命名

2011-12-29 15:02:27

JavaScript

2024-03-07 11:39:24

HadolintDockerfile工具

2017-07-14 09:54:47

代碼函數程序

2020-04-02 15:45:24

JavaScript開發(fā) 模塊

2020-03-02 09:26:16

JavaScript程序員JSON

2015-07-13 10:48:44

OC代碼程序員

2011-04-07 09:18:59

MySQL語法

2023-10-31 16:22:31

代碼質量軟件開發(fā)Java

2023-03-09 15:05:46

HTMLWeb 開發(fā)SEO

2010-03-01 14:31:04

Java

2021-08-08 14:26:24

SQL數據庫開發(fā)

2011-04-01 09:13:19

VB程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美理论片在线观看 | 日韩欧美在线不卡 | 美女黄视频网站 | 亚洲一区不卡在线 | 欧美激情视频一区二区三区在线播放 | 久草在线免费资源 | 久久69精品久久久久久久电影好 | 欧美精品网 | 久久亚洲精品久久国产一区二区 | 一区二区三区视频播放 | 国产在线一区二区 | 夜夜操天天干 | 精品久久久久久久久久久久久久 | eeuss国产一区二区三区四区 | 欧美日韩久 | 伊人婷婷 | 一区二区三区视频播放 | 亚洲精品视频久久 | 久久这里只有精品首页 | 欧美日韩网站 | 欧美日韩中文字幕 | 欧美日韩国产精品一区二区 | 久久人体视频 | 久久久久久成人 | 午夜在线精品 | 日本精品视频 | 久久亚洲综合 | 一区二区三区四区在线视频 | 久久久久高清 | 无码日韩精品一区二区免费 | 一区在线播放 | 九九精品网 | 国产精品久久久久久久久久久久久 | 一级片网站视频 | 久久久人成影片免费观看 | 在线观看日本高清二区 | 日本亚洲一区 | 日韩中文在线视频 | 日韩第一夜 | 亚洲精品久久区二区三区蜜桃臀 | 九九九久久国产免费 |