国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript中的箭頭函數(shù)

2024-05-06 16:23:55
字體:
供稿:網(wǎng)友

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

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

 

 
  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> 

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

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

只有當(dāng) --> 出現(xiàn)在一行的開始時(shí),才表示該箭頭是一個(gè)注釋,因?yàn)樵谄渌闆r下,--> 是一個(gè)操作符(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(); 

上面代碼是真實(shí)能運(yùn)行的。循環(huán)運(yùn)行直到 n 為 0,這并不是 ES6 的新特性,但結(jié)合我們熟悉的特性,這具有很強(qiáng)的誤導(dǎo)性。你能搞明白上面代碼的運(yùn)行情況嗎?你可以在 Stack Overflow 上找到相應(yīng)的解答。

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

goes to 操作符

<= 小于等于操作符

=> ???

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

首先,我們來談?wù)労瘮?shù)。

無處不在的函數(shù)表達(dá)式

JavaScript 一個(gè)有趣的特點(diǎn)是,任何時(shí)候你需要一個(gè)函數(shù),你可以很方便地創(chuàng)建它們。

例如,為一個(gè)按鈕綁定點(diǎn)擊事件:

 

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

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

 

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

現(xiàn)在對(duì)我們來說,編寫這樣的代碼是最自然的事了。但是在 JavaScript 流行起來之前,這種風(fēng)格的代碼看起來還是有些奇怪,因?yàn)樵谄渌Z言中都沒有這樣的特性。在 1958 年,Lisp 就有了函數(shù)表達(dá)式,也叫 lambda 函數(shù),而在存在多年的 C++、Python、C# 和 Java 中沒有該特性。

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

與其他幾門語言相比,JavaScript 的語法略顯冗長(zhǎng):

 

 
  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 

箭頭函數(shù)

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

 

 
  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()); 

當(dāng)你需要只有一個(gè)參數(shù)的函數(shù),箭頭函數(shù)的語法可以簡(jiǎn)化為 Identifier => Expression,直接省略了 function 和 return 關(guān)鍵字,連括號(hào)和結(jié)尾的分號(hào)也同時(shí)省略了。

編寫一個(gè)有多個(gè)(或沒有參數(shù),或 Rest 參數(shù)和參數(shù)默認(rèn)值,或解構(gòu)參數(shù))參數(shù)的函數(shù),你需要用括號(hào)將參數(shù)括起來:

 

 
  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); 

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

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

 

 
  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. }); 

下面是采用箭頭函數(shù)的寫法:

 

 
  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. }); 

需要注意的是,使用語句塊的箭頭函數(shù)不會(huì)自動(dòng)返回一個(gè)值,必須顯式地使用 return 來返回一個(gè)值。

還有一個(gè)忠告,當(dāng)使用箭頭函數(shù)來返回一個(gè)對(duì)象時(shí),始終使用括號(hào)將返回的對(duì)象括起來:

 

 
  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 

因?yàn)榭諏?duì)象 {} 與空語句塊 {} 看上去一模一樣,ES6 將始終把緊跟在 => 后面的 { 當(dāng)作語句塊的開始,而不是一個(gè)對(duì)象的開始,那么 puppy => {} 就被解析為一個(gè)沒有函數(shù)體的箭頭函數(shù),而且返回值為 undefined。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 高邮市| 江永县| 苗栗市| 永城市| 双牌县| 田阳县| 四子王旗| 水城县| 仁化县| 安顺市| 甘洛县| 扶余县| 邻水| 西峡县| 西林县| 大洼县| 青河县| 鄂尔多斯市| 三门县| 乌拉特前旗| 南宁市| 武冈市| 凤冈县| 西安市| 疏附县| 资兴市| 绿春县| 平潭县| 大宁县| 泾川县| 中阳县| 张家港市| 南靖县| 西昌市| 安宁市| 桐庐县| 伊通| 增城市| 收藏| 赣州市| 广平县|