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

遇事不決箭頭函數(shù)?別期望“萬金油”語法

開發(fā) 前端
事實(shí)上,箭頭函數(shù)并不一定能解決編寫JavaScript函數(shù)時(shí)的每一項(xiàng)需求?!叭f金油”函數(shù)是奢談,下面就讓我們深入探討幾個(gè)箭頭函數(shù)不能解決的情況吧。

本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)

ES6箭頭函數(shù)似乎是一種很上癮的函數(shù),一旦了解你很容易用到停不下來。作為2015年ECMAScript 6更新的一部分,箭頭函數(shù)有充分理由迅速流行。箭頭函數(shù)語法是極好的語法糖,能解決很多需求:

  • 函數(shù)關(guān)鍵字
  • 花括號(hào)
  • return關(guān)鍵字(對(duì)于單行函數(shù))

此外,箭頭函數(shù)還降低了JavaScript的函數(shù)范圍以及this關(guān)鍵字的部分復(fù)雜性,因?yàn)橛袝r(shí)真正需要的只是一個(gè)匿名函數(shù)。

[[324242]]

但事實(shí)上,箭頭函數(shù)并不一定能解決編寫JavaScript函數(shù)時(shí)的每一項(xiàng)需求。“萬金油”函數(shù)是奢談,下面就讓我們深入探討幾個(gè)箭頭函數(shù)不能解決的情況吧。

對(duì)象原型

先看JavaScript代碼片段:

  1. classRobot { 
  2.        constructor(name,catchPhrase) { 
  3.          this.name= name; 
  4.          this.catchPhrase= catchPhrase; 
  5.        } 
  6.      }; 
  7.      Robot.prototype.speak= () => { 
  8.        console.log(this === window); 
  9.        return this.catchPhrase 
  10.      }; 
  11.      const ironG =newRobot("Iron Giant", "Be good"); 
  12.      ironG.speak(); 

第15行的函數(shù)調(diào)用如下:

  1. true 
  2. undefined 

定義了speak() 原型函數(shù),并為新Robot對(duì)象傳遞了口號(hào),那為什么這段代碼的計(jì)算結(jié)果是未定義的呢?

console.log()揭示了原因。如你所見,當(dāng)要求控制臺(tái)判斷(this === window)時(shí),它返回true。這為上文對(duì)象方法示例中討論的內(nèi)容提供了依據(jù)。

當(dāng)使用需要上下文的函數(shù)時(shí),必須使用常規(guī)函數(shù)語法,以便使this正確綁定:

  1. Robot.prototype.speak=function() { 
  2.                       console.log(this === ironG); // true 
  3.                       return this.catchphrase; 
  4.                     }; 

對(duì)象方法

假設(shè)想要?jiǎng)?chuàng)建一個(gè)綁定到對(duì)象的方法。

  1. const mario = { 
  2.          lives: 3, 
  3.          oneUp: () => { 
  4.              this.lives++; 
  5.          } 
  6.      } 

這個(gè)例子中,如調(diào)用mario.oneUp(),mario.lives的值應(yīng)該從3增加到4。然而,按照目前所寫的代碼,無論調(diào)用多少次oneUp(), lives的值都將保持不變。

為什么?正是因?yàn)閠his!

正如MDN所述:箭頭函數(shù)自身沒有this。使用了封閉詞法范圍的this值;箭頭函數(shù)遵循正常的變量查找規(guī)則。因此,當(dāng)搜索當(dāng)前作用域中不存在的this時(shí),箭頭函數(shù)最終會(huì)從其封閉作用域中找到this。

例子中,封閉的范圍是window對(duì)象。調(diào)用oneUp()會(huì)要求程序增加window對(duì)象中l(wèi)ives的值。這樣的值不存在,所以代碼不起作用。

相反,應(yīng)該使用傳統(tǒng)的函數(shù)語法,它將函數(shù)的this綁定到調(diào)用該函數(shù)的特定對(duì)象上:

  1. const mario = { 
  2.        lives: 3, 
  3.        oneUp: function() { 
  4.          this.lives++; 
  5.        } 
  6.      }; 

動(dòng)態(tài)上下文

最后一個(gè)例子:

  1. const button = document.querySelector(#darkMode); 
  2.                                 button.addEventListener('click', () => { 
  3.                                   this.classList.toggle('on'); 
  4.                                 }); 

到目前為止,你可能已經(jīng)意識(shí)到這個(gè)代碼無效及其原因。沒錯(cuò),這又和this有關(guān)。

箭頭函數(shù)語法在函數(shù)聲明時(shí)靜態(tài)地綁定上下文,這與使用事件處理程序或事件監(jiān)聽器時(shí)試圖實(shí)現(xiàn)的相反,它們本質(zhì)上是動(dòng)態(tài)的。

當(dāng)通過事件處理程序或監(jiān)聽器操作DOM時(shí),觸發(fā)的事件指向?qū)儆谀繕?biāo)元素的this。

對(duì)于全局執(zhí)行上下文中定義的箭頭函數(shù),this將指向window。因此,上面的代碼中,this.classList將被認(rèn)為是window.classList,從而導(dǎo)致TypeError。

 

[[324243]]

 

 

圖源:unsplash

 

從這幾個(gè)簡(jiǎn)單的例子中可以發(fā)現(xiàn),JavaScript中關(guān)于this的內(nèi)容值得研究,這也許會(huì)加深你對(duì)何時(shí)使用或不使用箭頭函數(shù)的理解。

 

責(zé)任編輯:趙寧寧 來源: 讀芯術(shù)
相關(guān)推薦

2020-11-02 17:34:22

數(shù)據(jù)分析人工智能技術(shù)

2023-10-24 08:01:38

String傳統(tǒng)

2023-06-30 07:19:25

電源供電顯卡

2024-12-26 09:58:18

2021-06-29 07:19:06

Redis容器化K8S

2021-06-29 15:39:16

容器技術(shù)Redis

2025-04-24 08:25:00

2021-01-28 14:41:08

麥肯錫數(shù)字化項(xiàng)目

2021-12-15 10:20:08

緩存架構(gòu)開發(fā)

2018-07-01 08:34:09

緩存數(shù)據(jù)服務(wù)

2022-06-07 17:01:31

UI框架前端

2013-02-22 09:43:41

面向?qū)ο?/a>面向?qū)ο缶幊?/a>

2017-09-04 16:20:38

Linuxshell命令

2021-11-08 11:21:18

redis 淘汰算法

2020-09-24 10:03:54

Python開發(fā)語言

2023-08-01 16:21:44

模型AI

2021-06-16 09:30:06

深度學(xué)習(xí)編程人工智能

2025-06-13 00:03:00

2019-04-30 13:54:55

大數(shù)據(jù)Hadoop數(shù)據(jù)清洗

2023-02-16 08:03:06

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 精品一区久久 | 一区二区三区回区在观看免费视频 | 人人看人人草 | av一二三区 | 午夜久草 | 天天综合网91 | 精品国产乱码久久久久久牛牛 | 2021天天干夜夜爽 | 日韩av美女电影 | 亚洲a在线观看 | 亚洲精品乱码久久久久久按摩 | 久久精品色欧美aⅴ一区二区 | 97偷拍视频 | 久久99视频这里只有精品 | 成人在线中文字幕 | 精品日本久久久久久久久久 | 91精品免费 | 日韩精品在线观看一区二区三区 | 国产精品视频在线播放 | www.日韩欧美 | 精品视频一区在线 | 精品欧美一区二区三区久久久 | 国产成人免费视频 | 小h片免费观看久久久久 | 久久99精品久久久久 | 午夜专区| 日韩av一区二区在线观看 | 久久久精品一区二区三区 | 污片在线免费观看 | 男人天堂999 | 成人免费看片网 | 国产精品乱码一区二区三区 | 日本免费在线看 | 成人午夜免费视频 | 久亚州在线播放 | 色姑娘综合网 | 羞羞视频免费在线 | jizz亚洲人| 在线观看国产精品一区二区 | 久久午夜视频 | 日日操夜夜操天天操 |