日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JS中箭頭函數與this的寫法和理解

瀏覽:177日期:2024-04-08 08:59:09
前言

JavaScript在ES6語法中新增了箭頭函數,相較于傳統函數,箭頭函數不僅更加簡潔,而且在this方面進行了改進。this作為JavaScript中比較詭異的存在,許多文章對于this的解釋也不盡相同,本篇文章試圖厘清JS中函數與this的關系。

一、JS中函數的寫法1.常規函數的寫法

在ES6語法之前,JS中的函數由function關鍵字、params參數和被花括號包裹的函數體組成。為了與后面說到的箭頭函數相區別,我們先把這樣的函數叫做常規函數,常規函數既可以用聲明式寫法也可以用賦值式寫法。例子:

function test(name) { //聲明式寫法 console.log(name)}test(’Jerry’)let test2 = function(name) { //賦值式寫法 console.log(name)}test2(’Tom’)2. 箭頭函數的寫法

ES6箭頭函數的引入,使函數的寫法變的更加簡潔,但在書寫上要遵循一定的規則。

規則一:箭頭函數只能用賦值式寫法,不能用聲明式寫法

例子:

const test = (name) => { console.log(name)}test(’Jerry’)

規則二:如果參數只有一個,可以不加括號,如果沒有參數或者參數多于一個就需要加括號

例子:

const test = name => { console.log(name)}test(’Jerry’)const test2 = (name1, name2) => { console.log(name1 + ’ and ’ + name2)}test2(’Tom’, ’Jerry’)

規則三:如果函數體只有一句話,可以不加花括號

例子:

const test = name => console.log(name)

規則四:如果函數體沒有括號,可以不寫return,箭頭函數會幫你return

例子:

const add = (p1, p2) => p1 + p2add(10, 25)

記住:函數體的花括號與return關鍵字同在。

從以上的例子我們可以看出,箭頭函數對常規函數的圓括號和花括號都進行了簡化。除了這些簡化,箭頭函數對于常規函數最大的優化之處在于this。

二、理解常規函數中this

在探討箭頭函數對于this的優化之前,我們先得明白this究竟是什么,以及它是如何使用的。this是使用call方法調用函數時傳遞的第一個參數,它可以在函數調用時修改,在函數沒有調用的時候,this的值是無法確定。

如果沒有使用過call方法來調用函數的話,上面的對于this的定義可能不太明白。那么我們需要先理解函數調用的兩種方法。

1. 純粹的函數調用

第一種方法最常見,例子如下:

function test(name) { console.log(name) console.log(this)}test(’Jerry’) //調用函數

這種方法我們使用最多,但是這種函數調用方法只是一種簡寫,它完整的寫法是下面這樣的:

function test(name) { console.log(name) console.log(this)}test.call(undefined, ’Tom’)

注意到上面調用函數的call方法了嗎?call方法接收的第一個參數就是this,這里我們傳了一個undefined。那么,依據定義,函數執行了之后打出來的this會是undefined嗎?也不是。

如果你傳的 context 就 null 或者 undefined,那么 window 對象就是默認的 context(嚴格模式下默認 context 是 undefined)。

所以這里我們打出來的this是Window對象。

2. 對象中函數的調用

直接看例子:

const obj = { name: ’Jerry’, greet: function() { console.log(this.name) }}obj.greet() //第一種調用方法obj.greet.call(obj) //第二種調用方法

例子里第一種調用方法只是第二種調用方法的語法糖,第二種才是完整的調用方法,而且第二種方法厲害的地方在于它可以手動指定this。

手動指定this的例子:

const obj = { name: ’Jerry’, greet: function() { console.log(this.name) }}obj.greet.call({name: ’Spike’}) //打出來的是 Spike

從上面的例子我們看到greet函數執行時this,已經被我們改過了。

3. 構造函數中this

構造函數里的this稍微有點特殊,每個構造函數在new之后都會返回一個對象,這個對象就是this,也就是context上下文。

例子:

function Test() { this.name = ’Tom’}let p = new Test()console.log(typeof p) //objectconsole.log(p.name) // Tom4. window.setTimeout()和window.setInterval()中函數的調用

window.setTimeout()和window.setInterval()的函數中的this有些特殊,里面的this默認是window對象。

簡單總結一下:函數完整的調用方法是使用call方法,包括test.call(context, name)和obj.greet.call(context,name),這里的context就是函數調用時的上下文,也就是this,只不過這個this是可以通過call方法來修改的;構造函數稍微特殊一點,它的this直接指向new之后返回的對象;window.setTimeout()和window.setInterval()默認的是this是window對象。

三、理解箭頭函數中的this

上面關于this講了很多,this是函數用call方法調用時傳遞的第一個參數,而且它還可以手動更改,這樣要確定this的值就太麻煩了。不過,箭頭函數的出現給我們確定this幫了一些忙。

1. 箭頭函數的特性一:默認綁定外層this

上面提到:this的值是可以用call方法修改的,而且只有在調用的時候我們才能確定this的值。而當我們使用箭頭函數的時候,箭頭函數會默認幫我們綁定外層this的值,所以在箭頭函數中this的值和外層的this是一樣的。

不使用箭頭函數例子:

const obj = {a: function() { console.log(this) } }obj.a() //打出的是obj對象

使用箭頭函數的例子:

const obj = { a: () => { console.log(this) }}obj.a() //打出來的是window

在使用箭頭函數的例子里,因為箭頭函數默認不會使用自己的this,而是會和外層的this保持一致,最外層的this就是window對象。

2. 箭頭函數的特性二:不能用call方法修改里面的this

這個也很好理解,我們之前一直在說,函數的this可以用call方法來手動指定,而為了減少this的復雜性,箭頭函數無法用call方法來指定this。

例子:

const obj = { a: () => { console.log(this) }}obj.a.call(’123’) //打出來的結果依然是window對象

因為上文我們說到window.setTimeout()中函數里的this默認是window,我們也可以通過箭頭函數使它的this和外層的this保持一致:

window.setTimeout()的例子:

const obj = { a: function() { console.log(this) window.setTimeout(() => { console.log(this) }, 1000) }}obj.a.call(obj) //第一個this是obj對象,第二個this還是obj對象

想必大家明白了,函數obj.a沒有使用箭頭函數,因為它的this還是obj,而setTimeout里的函數使用了箭頭函數,所以它會和外層的this保持一致,也是obj;如果setTimeout里的函數沒有使用箭頭函數,那么它打出來的應該是window對象。

四、多層對象嵌套里函數的this

這里是筆者在學習時遇到的一點疑惑。箭頭函數里的this是和外層保持一致的,但是如果這個外層有好多層,那它是和哪層保持一致呢?

直接上例子:

const obj = { a: function() { console.log(this) }, b: { c: function() {console.log(this)}}}obj.a() // 打出的是obj對象, 相當于obj.a.call(obj)obj.b.c() //打出的是obj.b對象, 相當于obj.b.c.call(obj.b)

上面的代碼都符合直覺,接下來把obj.b.c對應的函數換成箭頭函數,結果如下:

const obj = { a: function() { console.log(this) }, b: { c: () => {console.log(this)}}}obj.a() //沒有使用箭頭函數打出的是objobj.b.c() //打出的是window對象!!

obj.a調用后打出來的是obj對象,而obj.b.c調用后打出的是window對象而非obj,這表示多層對象嵌套里箭頭函數里this是和最最外層保持一致的。

上面的內容就是筆者學習箭頭函數中梳理出來的知識點,如有錯誤,請批評指正!這是我在掘金上寫的第三篇文章,感謝閱讀!

本文參考:this 的值到底是什么?一次說清楚

總結

到此這篇關于JS中箭頭函數與this的寫法和理解的文章就介紹到這了,更多相關JS箭頭函數與this內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99香蕉国产精品偷在线观看 | 一本色道久久精品| 久久人人精品| 激情91久久| 91精品啪在线观看国产爱臀| 国产福利亚洲| 国产一区二区中文| 91精品国产自产在线丝袜啪| 日韩av片子| 水野朝阳av一区二区三区| 国产精品久久| av高清不卡| 日日夜夜免费精品| 群体交乱之放荡娇妻一区二区| 久久av国产紧身裤| 激情视频一区二区三区| 国产日产精品_国产精品毛片 | 国产成人精品福利| 99国产精品久久久久久久成人热| 欧美日韩中文字幕一区二区三区 | 亚洲人成在线影院| 国产精品二区不卡| 亚洲综合不卡| 国产成人精品一区二区三区在线| 久久av导航| 中文无码日韩欧| 久久精品123| 精品视频亚洲| 亚洲区欧美区| 婷婷国产精品| 精品福利久久久| 91福利精品在线观看| 黄色成人在线网址| 深夜福利视频一区二区| 欧美日本精品| 美女黄网久久| 久久久久国产精品一区二区| 久久av偷拍| 亚洲欧美在线综合| 尤物在线精品| 久久三级福利| www在线观看黄色| 日韩**一区毛片| 午夜在线精品| 激情综合网站| 999国产精品视频| 97精品视频在线看| 国产精品中文字幕制服诱惑| 日韩影院精彩在线| 香蕉国产精品| 久久久久国产精品一区三寸| 卡一卡二国产精品| 日韩不卡一区二区三区| 狠狠干综合网| 午夜久久99| 久久亚洲国产| 午夜精品成人av| 91免费精品| 国产不卡人人| 精品国产18久久久久久二百| 久久精品欧洲| 国产精品白浆| 国产精品一区二区三区四区在线观看| 国产不卡人人| 久久电影tv| 亚洲国产成人二区| 日本久久精品| 成人va天堂| 99精品一区| 欧美 日韩 国产一区二区在线视频 | 欧美偷窥清纯综合图区| 日韩综合一区二区| 欧美日本一区| 国产精品视频一区二区三区 | 欧美精品日日操| 群体交乱之放荡娇妻一区二区| 亚洲精品欧美| 婷婷精品在线观看| 日本a口亚洲| 国产日韩欧美| 国产精品jk白丝蜜臀av小说| 日韩va亚洲va欧美va久久| 日韩激情综合| 精品中文字幕一区二区三区四区| 一二三区精品| 91欧美日韩在线| 精品高清久久| 日韩免费小视频| 一本一道久久a久久精品蜜桃| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国产一区二区三区天码| 精品国产成人| 亚洲午夜黄色| 日本在线视频一区二区| 久久精品三级| 欧美午夜不卡影院在线观看完整版免费| 精品不卡一区| 最新日韩欧美| 国产精品中文| 宅男在线一区| 7777精品| 国产91欧美| 91精品成人| 国产精品一区二区三区av麻| 中文在线а√在线8| 天堂成人国产精品一区| 国产精品va| 一区二区亚洲精品| 国产精品巨作av| 欧美色图一区| 欧美在线日韩| 欧洲毛片在线视频免费观看| 日本精品在线播放| se01亚洲视频 | 亚洲专区视频| 天堂√中文最新版在线| 亚洲精品影院在线观看| 国产精东传媒成人av电影| 欧美午夜精彩| 欧美精品国产| 欧美影院三区| 国产精品15p| 中文字幕中文字幕精品| 黑人精品一区| 久久狠狠久久| 亚洲尤物在线| 中文字幕人成乱码在线观看| 欧美伊人影院| 亚洲欧美日韩国产一区二区| 日韩在线不卡| 国产精品久久久久9999高清| 老牛影视一区二区三区| 亲子伦视频一区二区三区| 国产精品自在| 日韩在线成人| 欧美特黄视频| 日韩欧美自拍| 久久只有精品| 清纯唯美亚洲综合一区| 亚洲欧美久久| 欧美另类专区| 成人自拍av| 日韩a一区二区| 国产精品sm| 日韩成人午夜精品| 男女男精品视频网| 亚洲成人三区| 国产在线欧美| 欧美aa在线观看| 福利欧美精品在线| 精品中文在线| 国产欧美日韩影院| 日本综合精品一区| 中文一区二区| 亚洲成人免费| 日韩视频网站在线观看| 国产一区二区三区视频在线| 久久99影视| 国产精品magnet| 国产精品一区二区av日韩在线| 亚洲播播91| 88xx成人免费观看视频库| 欧美国产美女| 国产精品福利在线观看播放| 麻豆一区二区在线| 国产精品国码视频| 日韩成人精品一区二区三区| 中文字幕视频精品一区二区三区| 美女视频免费精品| 国产日韩一区二区三区在线播放| 日韩av在线中文字幕| 精品久久97| 日本欧美国产| 亚洲最新无码中文字幕久久| 日韩中文首页| 久久精选视频| 亚洲精品2区| 在线综合亚洲| 免播放器亚洲一区| 日本亚洲三级在线| 欧美私人啪啪vps| 国产精品久久乐| 国产精品115| 久久99影视| 黄色aa久久| 野花国产精品入口| 视频一区免费在线观看| 在线日韩成人| 日韩高清成人在线| 国产欧美日韩精品高清二区综合区 | 日韩精品中文字幕一区二区| 日韩中文av| 国产欧美日韩精品高清二区综合区 | 91国内精品| 久久麻豆视频| 国产精品99一区二区三| 99久久亚洲精品| 欧美1级日本1级| 亚洲日本免费电影| 精品一区视频|