亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

JS中箭頭函數(shù)與this的寫法和理解

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

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

一、JS中函數(shù)的寫法1.常規(guī)函數(shù)的寫法

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

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

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

規(guī)則一:箭頭函數(shù)只能用賦值式寫法,不能用聲明式寫法

例子:

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

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

例子:

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

規(guī)則三:如果函數(shù)體只有一句話,可以不加花括號

例子:

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

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

例子:

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

記?。汉瘮?shù)體的花括號與return關(guān)鍵字同在。

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

二、理解常規(guī)函數(shù)中this

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

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

1. 純粹的函數(shù)調(diào)用

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

function test(name) { console.log(name) console.log(this)}test(’Jerry’) //調(diào)用函數(shù)

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

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

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

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

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

2. 對象中函數(shù)的調(diào)用

直接看例子:

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

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

手動指定this的例子:

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

從上面的例子我們看到greet函數(shù)執(zhí)行時this,已經(jīng)被我們改過了。

3. 構(gòu)造函數(shù)中this

構(gòu)造函數(shù)里的this稍微有點特殊,每個構(gòu)造函數(shù)在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()中函數(shù)的調(diào)用

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

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

三、理解箭頭函數(shù)中的this

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

1. 箭頭函數(shù)的特性一:默認(rèn)綁定外層this

上面提到:this的值是可以用call方法修改的,而且只有在調(diào)用的時候我們才能確定this的值。而當(dāng)我們使用箭頭函數(shù)的時候,箭頭函數(shù)會默認(rèn)幫我們綁定外層this的值,所以在箭頭函數(shù)中this的值和外層的this是一樣的。

不使用箭頭函數(shù)例子:

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

使用箭頭函數(shù)的例子:

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

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

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

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

例子:

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

因為上文我們說到window.setTimeout()中函數(shù)里的this默認(rèn)是window,我們也可以通過箭頭函數(shù)使它的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對象

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

四、多層對象嵌套里函數(shù)的this

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

直接上例子:

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

上面的代碼都符合直覺,接下來把obj.b.c對應(yīng)的函數(shù)換成箭頭函數(shù),結(jié)果如下:

const obj = { a: function() { console.log(this) }, b: { c: () => {console.log(this)}}}obj.a() //沒有使用箭頭函數(shù)打出的是objobj.b.c() //打出的是window對象?。?p>obj.a調(diào)用后打出來的是obj對象,而obj.b.c調(diào)用后打出的是window對象而非obj,這表示多層對象嵌套里箭頭函數(shù)里this是和最最外層保持一致的。

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

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

總結(jié)

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

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产一区视频在线播放 | 国产亚洲精品国产一区 | 亚洲天天做日日做天天看2018 | 永久免费视频v片www | 日韩欧美一区二区不卡 | 中文区永久区乱码六区 | 久久久四虎成人永久免费网站 | 国产精品视频免费视频 | 国产精彩对白综合视频 | 久草中文在线视频 | 美国特级片| 麻豆视频免费在线 | 日韩美女一级毛片a | 国产亚洲精品一区久久 | 中文字幕第一页在线 | 欧美影院天天5g天天爽 | 日韩精品一区二区三区 在线观看 | 日韩天天摸天天澡天天爽视频 | 亚洲欧美精品一区二区 | 久久中文字幕制服丝袜美腿 | 91亚洲福利| 五月天激激婷婷大综合丁香 | 日本高清久久 | 午夜成年人网站 | 美女mm翘臀后进式动态图 | 成年人免费黄色 | 两性色午夜视频自由成熟的性 | 精品九九久久国内精品 | 国产日韩精品欧美一区视频 | 久久精品国产999久久久 | 国产成人精品999在线 | 一级a级国产不卡毛片 | 国产精品久久久久天天影视 | 国内精品91 | 国产亚洲在线 | 久996视频精品免费观看 | 中文字幕第98页小明免费 | 国产黄色的视频 | 亚洲绝美精品一区二区 | a级毛片免费观看网站 | 香蕉视频在线免费看 |