首先必須要說的是,this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件(這句話有些問題,後面會解釋為什麼會有問題,雖然網上大部分的文章都是這樣說的,雖然在很多情況下那樣去理解不會出什麼問題,但是實際上那樣理解是不準確的,所以在你理解this的時候會有種琢磨不透的感覺),那麼接下來我會深入的**這個問題。
例子1:
function a()按照我們上面說的this最終指向的是呼叫它的物件,這裡的函式a實際是被window物件所點出來的,下面的**就可以證明。a();
function a()和上面**一樣吧,其實alert也是window的乙個屬性,也是window點出來的。window.a();
例子2:
var o =這裡的this指向的是物件o,因為你呼叫這個fn是通過o.fn()執行的,那自然指向就是物件o,這裡再次強調一點,this的指向在函式建立的時候是決定不了的,在呼叫的時候才能決定,誰呼叫的就指向誰,一定要搞清楚這個。}o.fn();
其實例子1和例子2說的並不夠準確,下面這個例子就可以推翻上面的理論。
如果要徹底的搞懂this必須看接下來的幾個例子
例子3:
var o =這段**和上面的那段**幾乎是一樣的,但是這裡的this為什麼不是指向window,如果按照上面的理論,最終this指向的是呼叫它的物件,這裡先說個而外話,window是js中的全域性物件,我們建立的變數實際上是給window新增屬性,所以這裡可以用window點o物件。}window.o.fn();
這裡先不解釋為什麼上面的那段**this為什麼沒有指向window,我們再來看一段**。
var o =這裡同樣也是物件o點出來的,但是同樣this並沒有執行它,那你肯定會說我一開始說的那些不就都是錯誤的嗎?其實也不是,只是一開始說的不準確,接下來我將補充一句話,我相信你就可以徹底的理解this的指向的問題。}}o.b.fn();
情況3:如果乙個函式中有this,這個函式中包含多個物件,儘管這個函式是被最外層的物件所呼叫,this指向的也只是它上一級的物件,例子3可以證明,如果不相信,那麼接下來我們繼續看幾個例子。
var o =儘管物件b中沒有屬性a,這個this指向的也是物件b,因為this只會指向它的上一級物件,不管這個物件中有沒有this要的東西。}}o.b.fn();
還有一種比較特殊的情況,例子4:
var o =這裡this指向的是window,是不是有些蒙了?其實是因為你沒有理解一句話,這句話同樣至關重要。}}var j = o.b.fn;
j();
this永遠指向的是最後呼叫它的物件,也就是看它執行的時候是誰呼叫的,例子4中雖然函式fn是被物件b所引用,但是在將fn賦值給變數j的時候並沒有執行所以最終指向的是window,這和例子3是不一樣的,例子3是直接執行了fn。
this講來講去其實就是那麼一回事,只不過在不同的情況下指向的會有些不同,上面的總結每個地方都有些小錯誤,也不能說是錯誤,而是在不同環境下情況就會有不同,所以我也沒有辦法一次解釋清楚,只能你慢慢地的去體會。
建構函式版this:
function fn()這裡之所以物件a可以點出函式fn裡面的user是因為new關鍵字可以改變this的指向,將這個this指向物件a,為什麼我說a是物件,因為用了new關鍵字就是建立乙個物件例項,理解這句話可以想想我們的例子3,我們這裡用變數a建立了乙個fn的例項(相當於複製了乙份fn到物件a裡面),此時僅僅只是建立,並沒有執行,而呼叫這個函式fn的是物件a,那麼this指向的自然是物件a,那麼為什麼物件a中會有user,因為你已經複製了乙份fn函式到物件a中,用了new關鍵字就等同於複製了乙份。var a = new fn();
console.log(a.user); //追夢子
更新乙個小問題當this碰到return時
function fn()再看乙個; }
var a = new fn;
console.log(a.user); //undefined
function fn() ;}再來var a = new fn;
console.log(a.user); //undefined
function fn()var a = new fn;
console.log(a.user); //追夢子
function fn()什麼意思呢?var a = new fn;
console.log(a.user); //追夢子
如果返回值是乙個物件,那麼this指向的就是那個返回的物件,如果返回值不是乙個物件那麼this還是指向函式的例項。
function fn()還有一點就是雖然null也是物件,但是在這裡this還是指向那個函式的例項,因為null比較特殊。var a = new fn;
console.log(a); //fn
function fn()知識點補充:var a = new fn;
console.log(a.user); //追夢子
1.在嚴格版中的預設的this不再是window,而是undefined。
2.new操作符會改變函式this的指向問題,雖然我們上面講解過了,但是並沒有深入的討論這個問題,網上也很少說,所以在這裡有必要說一下。
function fn()var a = new fn();
console.log(a.num); //1
this指向問題
一 this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件 例項一 函式this指向 function a a undefined windowwindow.a undefined window 解釋 這裡的a函式指向的...
this指向問題
在普通的函式中this指向window 在定時器中指向window,其實普通的函式和定時器都是window下的方法,所以都指向window 在乙個物件中的方法中this批向當前物件 new了 綁事件是事件源 真正觸發的 function fn a,b var aa fn.call 普通模式下this...
this指向問題
但是有時候這樣的判斷並不準確,可以按照如下規則進行判斷。瀏覽器環境 無論是否在嚴格模式下,在全域性執行環境中 在任何函式體外部 this 都指向全域性物件window node 環境 無論是否在嚴格模式下,在全域性執行環境中 在任何函式體外部 this 都是空物件 如果是new繫結並且 建構函式返回...