亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript中的箭頭函數

2024-05-06 16:23:55
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了深入理解JavaScript中的箭頭函數,文中主要針對ES6版本的JS進行相關的講解,需要的朋友可以參考下

從一開始箭頭就是 JavaScript 的一部分,在第一個 JavaScript 中就建議將內聯的腳本代碼包裹在 HTML 的注釋中,這可以防止那些不支持 JavaScript 的瀏覽器錯誤滴將你的代碼顯示為明文。你也許寫過下面這樣的代碼:

 

 
  1. <script language="javascript"
  2. <!-- 
  3. document.bgColor = "brown"// red 
  4. // --> 
  5. </script> 
  6.  
  7. <script language="javascript"
  8. <!-- 
  9. document.bgColor = "brown"// red 
  10. // --> 
  11. </script> 

古老的瀏覽器將看到兩個不被支持的標簽和一段注釋,只有支持 JavaScript 的新瀏覽器才會將其解析為 JavaScript 代碼。

為了支持這個古怪的特性,瀏覽器的 JavaScript 引擎把 也表示一個單行注釋,與 HTML 不同的是,在 HTML 中,--> 之前的部分是注釋內容,而在 JavaScript 中,在 --> 之后的行才是注釋。

只有當 --> 出現在一行的開始時,才表示該箭頭是一個注釋,因為在其他情況下,--> 是一個操作符(goes to)。

 

 
  1. function countdown(n) { 
  2. while (n-->0) // "n goes to zero" 
  3. alert(n); 
  4. blastoff(); 
  5.  
  6. function countdown(n) { 
  7. while (n-->0) // "n goes to zero" 
  8. alert(n); 
  9. blastoff(); 

上面代碼是真實能運行的。循環運行直到 n 為 0,這并不是 ES6 的新特性,但結合我們熟悉的特性,這具有很強的誤導性。你能搞明白上面代碼的運行情況嗎?你可以在 Stack Overflow 上找到相應的解答。

當然還有一個箭頭,那就是小于等于操作符 <=,也許你還可以找到使用箭頭的地方,但我們還是停下來,看一個我們從沒見過的箭頭:

goes to 操作符

<= 小于等于操作符

=> ???

那么,=> 表示什么呢?這就是本文將討論的話題。

首先,我們來談談函數。

無處不在的函數表達式

JavaScript 一個有趣的特點是,任何時候你需要一個函數,你可以很方便地創建它們。

例如,為一個按鈕綁定點擊事件:

 

 
  1. $("#confetti-btn").click( 
  2.  
  3. $("#confetti-btn").click( 

jQuery 的 .click() 方法需要一個函數作為參數,我們可以很方便地就地創建一個函數:

 

 
  1. $("#confetti-btn").click(function (event) { 
  2. playTrumpet(); 
  3. fireConfettiCannon(); 
  4. }); 
  5.  
  6.  
  7. $("#confetti-btn").click(function (event) { 
  8. playTrumpet(); 
  9. fireConfettiCannon(); 
  10. }); 

現在對我們來說,編寫這樣的代碼是最自然的事了。但是在 JavaScript 流行起來之前,這種風格的代碼看起來還是有些奇怪,因為在其他語言中都沒有這樣的特性。在 1958 年,Lisp 就有了函數表達式,也叫 lambda 函數,而在存在多年的 C++、Python、C# 和 Java 中沒有該特性。

現在,這四門語言都有了 lambda 表達式,而且新出現的語言都普遍內置了 lambda 表達式。如今 JavaScript 也支持該特性了,這必須感謝那些重度依賴 lambda 表達式的庫的開發者,這推動了該特性被廣泛采納。

與其他幾門語言相比,JavaScript 的語法略顯冗長:

 

 
  1. // A very simple function in six languages. 
  2. function (a) { return a > 0; } // JS 
  3. [](int a) { return a > 0; } // C++ 
  4. (lambda (a) (> a 0)) ;; Lisp 
  5. lambda a: a > 0 # Python 
  6. a => a > 0 // C# 
  7. a -> a > 0 // Java 
  8.  
  9. // A very simple function in six languages. 
  10. function (a) { return a > 0; } // JS 
  11. [](int a) { return a > 0; } // C++ 
  12. (lambda (a) (> a 0)) ;; Lisp 
  13. lambda a: a > 0 # Python 
  14. a => a > 0 // C# 
  15. a -> a > 0 // Java 

箭頭函數

ES6 引入了一種新的語法來編寫函數:

 

 
  1. // ES5 
  2. var selected = allJobs.filter(function (job) { 
  3. return job.isSelected(); 
  4. }); 
  5.  
  6. // ES6 
  7. var selected = allJobs.filter(job => job.isSelected()); 
  8.  
  9.  
  10. // ES5 
  11. var selected = allJobs.filter(function (job) { 
  12. return job.isSelected(); 
  13. }); 
  14.  
  15. // ES6 
  16. var selected = allJobs.filter(job => job.isSelected()); 

當你需要只有一個參數的函數,箭頭函數的語法可以簡化為 Identifier => Expression,直接省略了 function 和 return 關鍵字,連括號和結尾的分號也同時省略了。

編寫一個有多個(或沒有參數,或 Rest 參數和參數默認值,或解構參數)參數的函數,你需要用括號將參數括起來:

 

 
  1. // ES5 
  2. var total = values.reduce(function (a, b) { 
  3. return a + b; 
  4. }, 0); 
  5.  
  6. // ES6 
  7. var total = values.reduce((a, b) => a + b, 0); 
  8.  
  9. // ES5 
  10. var total = values.reduce(function (a, b) { 
  11. return a + b; 
  12. }, 0); 
  13.  
  14. // ES6 
  15. var total = values.reduce((a, b) => a + b, 0); 

箭頭函數還可以與一些工具函數庫完美地配合使用,比如 Underscore.js 和 Immutable,事實上,Immutable 文檔中的例子全部都是使用 ES6 編寫,其中有很多已經使用到了箭頭函數。

函數體除了使用一個表達式外,箭頭函數還可以包含一個語句塊,回憶之前我們提到過的例子:

 

 
  1. // ES5 
  2. $("#confetti-btn").click(function (event) { 
  3. playTrumpet(); 
  4. fireConfettiCannon(); 
  5. }); 
  6.  
  7. // ES5 
  8. $("#confetti-btn").click(function (event) { 
  9. playTrumpet(); 
  10. fireConfettiCannon(); 
  11. }); 

下面是采用箭頭函數的寫法:

 

 
  1. // ES6 
  2. $("#confetti-btn").click(event => { 
  3. playTrumpet(); 
  4. fireConfettiCannon(); 
  5. }); 
  6.  
  7. // ES6 
  8. $("#confetti-btn").click(event => { 
  9. playTrumpet(); 
  10. fireConfettiCannon(); 
  11. }); 

需要注意的是,使用語句塊的箭頭函數不會自動返回一個值,必須顯式地使用 return 來返回一個值。

還有一個忠告,當使用箭頭函數來返回一個對象時,始終使用括號將返回的對象括起來:

 

 
  1. // create a new empty object for each puppy to play with 
  2. var chewToys = puppies.map(puppy => {}); // BUG! 
  3. var chewToys = puppies.map(puppy => ({})); // ok 
  4.  
  5.  
  6. // create a new empty object for each puppy to play with 
  7. var chewToys = puppies.map(puppy => {}); // BUG! 
  8. var chewToys = puppies.map(puppy => ({})); // ok 

因為空對象 {} 與空語句塊 {} 看上去一模一樣,ES6 將始終把緊跟在 => 后面的 { 當作語句塊的開始,而不是一個對象的開始,那么 puppy => {} 就被解析為一個沒有函數體的箭頭函數,而且返回值為 undefined。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美久久一区二区| 国产精品久久一区主播| 疯狂做受xxxx欧美肥白少妇| 欧美激情二区三区| 欧美精品第一页在线播放| 亚洲a在线观看| 国产精品∨欧美精品v日韩精品| 国内精品中文字幕| 欧美精品制服第一页| 国产综合色香蕉精品| 日韩在线观看精品| 国产精品吊钟奶在线| 日韩av在线免播放器| 久久久久久国产精品三级玉女聊斋| 一区二区三区视频观看| 亚洲欧美激情另类校园| 久久久av网站| 日本亚洲欧美成人| 亚洲国产精品专区久久| 午夜精品福利视频| 欧美高清激情视频| 亚洲天堂影视av| 久久久www成人免费精品张筱雨| 亚洲色图50p| 亚洲美女性视频| 亚洲第一天堂av| 欧美一区三区三区高中清蜜桃| 欧美极品第一页| 亚洲xxxx3d| 精品在线观看国产| 欧美丰满老妇厨房牲生活| 欧美激情一区二区三区高清视频| 日韩精品免费一线在线观看| 久久久精品一区二区| 亚洲激情视频在线观看| 久久久噜久噜久久综合| 91国内产香蕉| 日韩高清欧美高清| 亚洲性夜色噜噜噜7777| 91亚洲精品在线| 国产精品九九九| 国产深夜精品福利| 国产精品第10页| 国模私拍一区二区三区| 成人淫片在线看| 奇米影视亚洲狠狠色| 久久久极品av| 欧美日韩国产一区在线| 一区二区三区四区视频| 国产精品18久久久久久首页狼| 91精品国产自产在线观看永久| 国产精品成人国产乱一区| 久久色免费在线视频| 欧美性高潮在线| 亚洲天堂av在线播放| 日本欧美一二三区| xxxxx91麻豆| 欧美日韩福利电影| 91精品国产自产在线老师啪| 91在线视频精品| 久久久久北条麻妃免费看| 亚洲男人第一av网站| 97涩涩爰在线观看亚洲| 欧美黑人性生活视频| 国产精品久久视频| 欧美一区二区影院| 少妇久久久久久| 懂色av中文一区二区三区天美| 久久久精品2019中文字幕神马| 曰本色欧美视频在线| 成人网在线免费观看| 国产97在线|亚洲| 久久天天躁狠狠躁夜夜躁| 91精品国产九九九久久久亚洲| 久久久久久久久国产| 欧美日韩在线免费| 日韩欧美中文字幕在线播放| 国产精品黄页免费高清在线观看| 日韩在线小视频| 久久精品色欧美aⅴ一区二区| 国产午夜精品全部视频播放| 欧美日韩精品在线| 啪一啪鲁一鲁2019在线视频| 国产精品精品久久久| 91爱视频在线| 亚洲欧美在线一区| 欧美性猛交xxxx乱大交| 欧美大学生性色视频| 欧美成人午夜激情在线| 亚洲色图激情小说| 欧美日韩成人黄色| 日韩在线观看av| 成人妇女免费播放久久久| 日韩大陆欧美高清视频区| 亚洲午夜久久久影院| 精品爽片免费看久久| 91禁外国网站| 亚洲国产成人精品久久| 日韩激情视频在线| 国产精品h片在线播放| 久久久99久久精品女同性| 91免费的视频在线播放| 91丨九色丨国产在线| 欧美极品第一页| 日韩精品视频观看| 亚洲色图25p| 日韩免费视频在线观看| 国产成人亚洲综合91| 97人洗澡人人免费公开视频碰碰碰| 中文字幕在线成人| 国产脚交av在线一区二区| 伊是香蕉大人久久| 久久久视频在线| 亚洲精品电影久久久| 精品国产一区二区三区久久狼5月| 亚洲国产婷婷香蕉久久久久久| 精品福利视频导航| 亚洲国产精品福利| 亚洲精品少妇网址| 欧美视频在线观看 亚洲欧| 国产免费亚洲高清| 不卡av日日日| 粉嫩av一区二区三区免费野| 亚洲一级片在线看| 国产精品无码专区在线观看| 国产精品91在线观看| 一区二区三区四区精品| 亚洲乱码一区二区| 欧美午夜性色大片在线观看| 91精品国产色综合久久不卡98| 日韩精品免费在线播放| 久久综合免费视频影院| 伊人久久大香线蕉av一区二区| 97免费视频在线播放| 国产亚洲欧美日韩美女| 亚洲mm色国产网站| 91精品91久久久久久| 亚洲黄色av女优在线观看| 中文字幕精品影院| 欧美激情视频免费观看| 欧美资源在线观看| 亚洲91精品在线| 成人黄色片在线| 国产精品视频99| 国产成人精品电影久久久| 国产区精品在线观看| 日韩精品免费在线播放| 91久久精品久久国产性色也91| 欧美人交a欧美精品| 国产日韩av在线| 欧美麻豆久久久久久中文| 国产精品久久一区主播| 精品亚洲一区二区三区在线观看| 亚洲性视频网站| 精品国内产的精品视频在线观看| 91色p视频在线| 久久99精品国产99久久6尤物| 久久久精品亚洲| 最近2019中文字幕在线高清| 精品香蕉一区二区三区| 欧美大片第1页| 国模吧一区二区三区| 成人欧美一区二区三区在线湿哒哒| 亚洲人成电影网站色…|