JS中的this物件詳解

2021-08-03 10:20:39 字數 3036 閱讀 5793

js中this關鍵字很常見,但是它似乎變幻莫測,讓人抓狂。這篇文章就來揭示其中的奧秘。

借助阮一峰老師的話:它代表函式執行時,自動生成的乙個內部物件,只能在函式內部使用。這句話看似平常,可是要非常注意三個字:「執行時」,這說明this關鍵字只與函式的執行環境有關,而與宣告環境沒有關係。也就是這個this到底代表的是什麼物件要等到函式執行時才知道,有點類似函式定義時的引數列表只在函式呼叫時才傳入真正的物件。理解了這一點對後面this關鍵字規律的掌握有很大幫助。

當函式被儲存為乙個物件的屬性時,它就可稱為這個物件的方法。當乙個方法被呼叫時,this被繫結到這個物件上。如果呼叫表示式包含乙個提取屬性的動作(. 或 ),那麼它被稱為方法呼叫。例如:

1

2

3

4

5

6

7

8

varname ="window";

varobj =

};

obj.sayname();//kxy

sayname函式作為物件obj的方法呼叫,所以函式體中的this就代表obj物件。

當乙個函式並非乙個物件的屬性時,那麼它就是被當做函式來呼叫的。在此種模式下,this被繫結為全域性物件,在瀏覽器環境下就是window物件。例如:

1

2

3

4

5

varname ="window";

functionsayname()

sayname();

sayname以函式呼叫模式呼叫,所以函式體中的this代表window物件。

如果在乙個函式前面加上new關鍵字來呼叫,那麼就會建立乙個連線到該函式的prototype成員的新物件,同時,this會被繫結到這個新物件上。這種情況下,這個函式就可以成為此物件的建構函式。例如:

1

2

3

4

5

functionobj()

varperson =newobj();

console.log(person.name);//kxy

obj作為建構函式被呼叫,函式體內的this被繫結為新建立的物件person。

1

2

3

4

5

6

7

8

9

10

varname ="window";

varperson = ;

functionsayname()

sayname();//window

//kxy

//window

自此,函式呼叫的4種模式就都介紹完了,this的繫結規律也就是以上幾種,萬變不離其宗。為了簡單明瞭的介紹4種模式,以上的例子都比較簡單,那麼下面就跟我一起做乙個稍複雜的練習,檢驗下自己是否真正掌握了this繫結物件的方法吧!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

varname ="window";

functionshowname()

varperson1 =

varperson2 =

}

person1.sayname();//kxy

person2.sayname();//window

首先心中時刻提醒自己this是在函式執行時被繫結的,不要被任何賦值語句打亂陣腳。

先看第乙個執行語句:person1.sayname(); 首先確定這是方法呼叫模式,物件為person1,再看sayname被賦值為全域性函式物件showname,在showname執行時,this繫結的是person1,所以結果為」kxy」。

再看第二個執行語句:person2.sayname(); 這還是方法呼叫模式,物件為person2,呼叫的是它的sayname方法。再看sayname函式體,發現函式體最終執行的函式是fun,fun是用函式呼叫模式呼叫的。而fun最終也被賦值為showname函式,因為fun是用函式呼叫模式呼叫的,所以這裡的this繫結為window,結果為」window「。

JS中的event 物件詳解

event屬性和方法 1.type 事件的型別,如onlick中的click 2.srcelement target 事件源,就是發生事件的元素 3.button 宣告被按下的滑鼠鍵,整數,1代表左鍵,2代表右鍵,4代表中鍵,如果按下多個鍵,酒把這些值加起來,所以3就代表左右鍵同時按下 firefo...

筆記 js中this物件詳解

它代表函式執行時,自動生成的乙個內部物件,只能在函式內部使用。這句話看似平常,可是要非常注意三個字 執行時 這說明this關鍵字只與函式的執行環境有關,而與宣告環境沒有關係。也就是這個this到底代表的是什麼物件要等到函式執行時才知道,有點類似函式定義時的引數列表只在函式呼叫時才傳入真正的物件。理解...

js中 Date物件中方法詳解

var mydate new date mydate.getfullyear 獲取完整的年份 mydate.getyear 獲取當前年份 2位 mydate.getfullyear 獲取完整的年份 4位 mydate.getmonth 獲取當前月份 0 11,0代表1月 mydate.getdate...