箭頭函式 普通函式中的this指向

2021-09-11 01:59:46 字數 2693 閱讀 9812

this指向在箭頭函式和普通函式中的表現是不同的。

1、箭頭函式:首先要明白的是箭頭函式的this指標是固定的,就是箭頭函式被定義時其所在環境的物件(因為箭頭函式其實自己是沒有this指標的,其this指標是判定了其直接外層的函式的this指標(這裡說的是函式而不是物件,因為物件不直接形成單獨的作用域))

看乙個例子來驗證加粗的文字:

const cat = 

}

對比例子

const cat2 = 

}

呼叫cat.jumps()時,如果是普通函式,該方法內部的this指向cat;如果寫成上面那樣的箭頭函式,使得this指向全域性物件,因此不會得到預期結果。

從其特性也可以看出,箭頭函式兩種不適用的場景:定義物件的方法、以及需要動態繫結this的情況

首先必須要說的是,this的指向在函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件,.這句話有一點歧義,準確來說應該是 普通函式的this指向它被呼叫時的上一級物件

對這個上一級的理解:eg: a.b.fn() 上一級是b 而fn()上一級是window

下面會有具體的例子解釋。

例子1:

function a()

a();

按照我們上面說的this最終指向的是呼叫它的物件,這裡的函式a實際是被window物件所點出來的,下面的**就可以證明。

function a()

window.a();

和上面**一樣吧,其實alert也是window的乙個屬性,也是window點出來的。

例子2:

var o = 

}o.fn();

這裡的this指向的是物件o,因為你呼叫這個fn是通過o.fn()執行的,那自然指向就是物件o,這裡再次強調一點,this的指向在函式建立的時候是決定不了的,在呼叫的時候才能決定,誰呼叫的就指向誰,一定要搞清楚這個。

其實例子1和例子2說的並不夠準確,下面這個例子就可以推翻上面的理論。

如果要徹底的搞懂this必須看接下來的幾個例子

例子3:

複製**

var o =

}window.o.fn();

複製**

這段**和上面的那段**幾乎是一樣的,但是這裡的this為什麼不是指向window,如果按照上面的理論,最終this指向的是呼叫它的物件,這裡先說個而外話,window是js中的全域性物件,我們建立的變數實際上是給window新增屬性,所以這裡可以用window點o物件。

這裡先不解釋為什麼上面的那段**this為什麼沒有指向window,我們再來看一段**。

var o = 

}}o.b.fn();

這裡同樣也是物件o點出來的,但是同樣this並沒有執行它,那你肯定會說我一開始說的那些不就都是錯誤的嗎?其實也不是,只是一開始說的不準確,接下來我將補充一句話,我相信你就可以徹底的理解this的指向的問題。

情況1:如果乙個函式中有this,但是它沒有被上一級的物件所呼叫,那麼this指向的就是window,這裡需要說明的是在js的嚴格版中this指向的不是window,是undefiened

情況2:如果乙個函式中有this,這個函式有被上一級的物件所呼叫,那麼this指向的就是上一級的物件。

var o = 

}}o.b.fn();

這裡this指向的是window,是不是有些蒙了?其實是因為你沒有理解一句話,這句話同樣至關重要。

this永遠指向的是最後呼叫它的物件,也就是看它執行的時候是誰呼叫的,例子4中雖然函式fn是被物件b所引用,但是在將fn賦值給變數j的時候並沒有執行所以最終指向的是window,這和例子3是不一樣的,例子3是直接執行了fn。

this講來講去其實就是那麼一回事,只不過在不同的情況下指向的會有些不同,上面的總結每個地方都有些小錯誤,也不能說是錯誤,而是在不同環境下情況就會有不同,所以我也沒有辦法一次解釋清楚,只能你慢慢地的去體會。

補充箭頭函式的this指向

箭頭函式:根據所在的環境(我再哪個環境中,this就指向誰)

先來看乙個簡單的例子

document.onclick = function () 

document.onclick = () =>

這兩個你執行的時候普通函式this指向的是htmldocument,箭頭函式指向的是window。

如果還覺得不明顯再看下列**

document.onclick = function () 

arr.a(); //1,2,3

}

這裡先是使用普通函式,輸出了1,2,3。

下面我換成箭頭函式

document.onclick = function () 

arr.a(); //htmldocument

}

總結:普通函式的this指向它被呼叫時的上一級物件

對這個上一級的理解:eg: a.b.fn() 上一級是b 而fn()上一級是window

,箭頭函式指向它定義時所在的物件

參考文章

箭頭函式 普通函式

箭頭函式的語法比普通函式更簡潔,是乙個匿名函式,不能作為建構函式,且不能使用new 普通函式 letfun 普通函式 function fun 箭頭函式有兩種格式 一種是和return 另一種是把二者省略掉 1 1.不能使用newlet fun let fn newfun 1.function on...

普通函式和箭頭函式中的this指向

普通函式的this指向window function a a windowdom元素繫結事件時的this,控制代碼裡的 this 值是該元素的引用 document.onclick function thissetinterval和settimeout中傳入函式時,函式中的this會指向window...

箭頭函式中的this和普通函式中的this對比

es6中新增了箭頭函式這種語法,箭頭函式以其簡潔性和方便獲取this的特性。下面來總結一下他們之間的區別 普通函式下的this 箭頭函式中的this 看下面這段 function a a 因為a是乙個全域性函式,也就是掛載在window物件下的,所以a 等價於window.a var obj obj...