JS 箭頭函數(shù)的this指向詳解
箭頭函數(shù)是ES6中的新增特性,他沒(méi)有自己的this,其this指向從外層代碼庫(kù)繼承。
使用箭頭函數(shù)時(shí)要注意一下幾點(diǎn):
- 箭頭函數(shù)不能用作構(gòu)造函數(shù),用的話會(huì)拋出一個(gè)錯(cuò)誤
- 無(wú)法使用arguments參數(shù),如果要用的話就用rest
- 無(wú)法使用yield命令,所以箭頭函數(shù)無(wú)法用作Generator函數(shù)
- 因?yàn)闆](méi)有自己的this,所以沒(méi)法通過(guò)bind、call、apply來(lái)改變this指向
- 但是這不代表箭頭函數(shù)的this指向是靜態(tài)的,我們可以通過(guò)改變它外層代碼庫(kù)的this指向來(lái)控制
- 箭頭函數(shù)的this從外層代碼庫(kù)繼承,所以箭頭函數(shù)的this是在定義的時(shí)候就綁定好了的,而普通函數(shù)是在調(diào)用的時(shí)候確定this指向
- 字面量對(duì)象中直接定義的箭頭函數(shù)的this不綁定該對(duì)象,而是往外找一層,最簡(jiǎn)單的情況是綁定到window
PS: 實(shí)際開(kāi)發(fā)環(huán)境中,React可以使用箭頭函數(shù)解決一個(gè)經(jīng)典問(wèn)題,這里不細(xì)說(shuō)了。
給一個(gè)例子看一下箭頭函數(shù)的實(shí)際情況:
const obj = {
fun1: function () {
console.log(this);
return () => {
console.log(this);
}
},
fun2: function () {
return function () {
console.log(this);
return () => {
console.log(this);
}
}
},
fun3: () => {
console.log(this);
}
}
let f1 = obj.fun1(); // obj
f1() // obj
let f2 = obj.fun2();
let f2_2 = f2(); // window
f2_2() // window
obj.fun3(); // window
針對(duì)每行輸出的分析:
let f1 = obj.fun1() // obj
這里明顯進(jìn)行的是隱式綁定,fun1的this指向obj
f1() // obj
這里執(zhí)行了上一行返回出來(lái)的箭頭函數(shù),我們分析上一層代碼庫(kù)的this指向obj,所以直接繼承,箭頭函數(shù)this指向
objlet f2 =obj.fun2()
fun2第一層執(zhí)行的時(shí)候沒(méi)有打印代碼,而是返回了一個(gè)函數(shù)出來(lái),賦值給f2,并且這里發(fā)生了綁定丟失,this指向由原來(lái)的obj指向了window(發(fā)生了賦值)
let f2_2 = f2() // window
f2()執(zhí)行了,打印出了改綁后的this——window,然后將箭頭函數(shù)返回出來(lái),賦值給f2_2f
2_2() // window
執(zhí)行打印出window,剛才的外層代碼的this不是指向了window嗎,所以這里就繼承了window作為this
obj.fun3() // window
在字面量中直接定義的箭頭函數(shù)無(wú)法繼承該對(duì)象的this,而是往外再找一層,就找到了window,因?yàn)樽置媪繉?duì)象無(wú)法形成自己的一層作用域,但是構(gòu)造函數(shù)可以哦。
那我們?cè)趺床倏v箭頭函數(shù)的this指向呢:
答案是修改外層代碼庫(kù)的this指向,在箭頭函數(shù)定義之前就給this修改方向即可。
在以上代碼的基礎(chǔ)上:
let fun4 = f2.bind(obj)() // obj fun4() // obj
我們發(fā)現(xiàn)修改的是第二層方法的this指向,并且箭頭函數(shù)也繼承了下來(lái)。
fun2: function () {
return function () { // 我們修改的是這里的this
console.log(this);
return () => { // 然后這里定義的時(shí)候就繼承啦
console.log(this);
}
}
},
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
js兼容pc端瀏覽器并有多種彈出小提示的手機(jī)端浮層控件實(shí)例
這篇文章主要介紹了js兼容pc端瀏覽器并有多種彈出小提示的手機(jī)端浮層控件,實(shí)例分析了javascript多種彈出層效果的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Bun運(yùn)行時(shí)是新一代高性能JavaScript/TypeScript運(yùn)行時(shí)
Bun由Jarred Sumner創(chuàng)建,是一款新興的JavaScript和TypeScript運(yùn)行時(shí),旨在比Node.js和Deno提供更高性能和快速啟動(dòng),Bun使用Zig語(yǔ)言編寫,內(nèi)置包管理并支持Node.js大部分API,適用于高并發(fā)API服務(wù)和快速構(gòu)建工具2024-11-11
php簡(jiǎn)單數(shù)據(jù)庫(kù)操作類的封裝
這篇文章主要為大家詳細(xì)介紹了php簡(jiǎn)單數(shù)據(jù)庫(kù)操作類的封裝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
非常不錯(cuò)的不間斷循環(huán)滾動(dòng)類 兼容多瀏覽器
非常不錯(cuò)的不間斷循環(huán)滾動(dòng)類 兼容多瀏覽器...2006-12-12
javascript中導(dǎo)出與導(dǎo)入實(shí)現(xiàn)模塊化管理教程
這篇文章主要給大家介紹了關(guān)于javascript中導(dǎo)出與導(dǎo)入實(shí)現(xiàn)模塊化管理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
JS 實(shí)現(xiàn)BASE64_ENCODE和BASE64_DECODE(實(shí)例代碼)
JS 實(shí)現(xiàn)BASE64_ENCODE和BASE64_DECODE(實(shí)例代碼)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
解決layer彈出層自適應(yīng)頁(yè)面大小的問(wèn)題
今天小編就為大家分享一篇解決layer彈出層自適應(yīng)頁(yè)面大小的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09

