this指向問題及什麼時候不能使用箭頭函式?

2021-09-29 13:53:04 字數 1309 閱讀 8526

箭頭函式固然好用,但是也不能隨地濫用!

回答這個問題前,先來回想下this指向方面的問題

this只有在方法被呼叫的時候,才知道他的指向,定義的時候是不知道的。

而this的指向我把它劃分為以下幾種:

1. 物件裡方法中的this指向呼叫他的物件。比如延時器方法settimeout(),在呼叫時(非嚴格模式),其內部this指向為window,因為實際上它是window物件下的方法,即window.settimeout()。

注意:如果是很長的呼叫,如:a.b.c() 那麼在c中this的指向為最後的呼叫,即a.b這個物件。

3. 使用new時,this指向構造物件。 new 乙個建構函式時,會發生4步操作:

如 let person1 = new person()

第一步: 建立乙個新的物件 obj 

第二步: 將 obj 的constructor設定為其建構函式,並將 obj 的__proto__指向其建構函式的prototype

第三步: 更改person建構函式中的this指向為obj,執行person函式

第四步: 把obj 給 return出去。這裡有個注意點,return是預設進行的,無需在建構函式裡面寫。但如果在建構函式裡面寫了return且return的是簡單資料型別,那麼return的結果仍為新建立的物件 obj 。如果return出去的是乙個複雜型別,那麼return出去的將不會是新建立的物件 obj 。

ok,到這裡基本就確定了什麼時候不能用箭頭函式了,因為我認為箭頭函式最大的作用就是方便確定this作用域。

下面是幾個典型的例子不建議使用箭頭函式的地方:

一、使用addeventlistener時不建議使用箭頭函式。

示例:獲取dom物件 :

let domobj = document.getelementid('xx')

domobj.addeventlistener('click', () => , false)

根據上面的this指向可知,如果改為箭頭函式,其內部this會變成window,而不是domobj,因此不推薦使用箭頭函式。

二、物件內部宣告方法時,不建議使用箭頭函式,因為this會指向外部而不是呼叫它的那個物件:

示例:let obj =   // window

三、在建構函式的prototype上新增方法,不建議使用箭頭函式:

array.prototype.add = () =>   // window

四、vue的生命週期鉤子函式 :

其預設指向當前vm元件,如果使用箭頭函式宣告,則會更改其指向。

左轉彎待轉區,什麼時候能進,什麼時候不能進?

其實,不僅新手駕駛員不了解左轉彎待轉區的功能,甚至連很多老司機都未必搞得清這個區域該如何使用 這個區域是幹什麼用的?什麼時候可以進入這個區域?什麼時候又不能進入?以上這些疑問,本文都將為大家一一解答。說到左轉彎待轉區,除了新手司機以外,其實很多開車很多年的老車主,都不一定弄得清左轉彎待轉區該怎麼使用...

什麼時候用exists 什麼時候用in

in not in exists not exists 使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行 子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起 待子查...

什麼時候不能使用箭頭函式

js 中物件方法的定義方式是在物件上定義乙個指向函式的屬性,當方法被呼叫的時候,方法內的 this 就會指向方法所屬的物件。1.1 定義字面量方法 因為箭頭函式的語法很簡潔,可能不少同學會忍不住用它來定義字面量方法,比如下面的例子 const calculator console.log this ...