你真的懂this指向?
先搞清楚一點,如果this在函數里面,那么它指向的是“函數執(zhí)行后”的上一級調用對象。
var a="this is a";
function main() {
console.log(this.a)//這里this指向window.
}
main()//這里相當于window.main(),默認window對象了,所以可以省略;
var o={
x:"this is x",
y:"this is y",
say:function(){
console.log(this.x);
}
}
o.say();//這里的this指向的是對象o,因為你調用這個say是通過o.say()執(zhí)行的,那自然指向就是對象o,這里再次強調一點,this的指向在函數創(chuàng)建的時候是決定不了的,在調用的時候才能決定,誰調用的就指向誰,一定要搞清楚這個。
var o={
name:"maomin",
say1:function(){
console.log(this.name);//maomin
}
}
window.o.say1();
// 上面幾行代碼和之前的代碼幾乎相似,為什么沒有指向window,這就回到了我剛開始說的,this如果在函數內,那么它指向的是該函數執(zhí)行后的上一級調用對象。
var o={
a:"this is a",
b:{
a:"I am a",
say:function(){
console.log(this.a);//this is a
}
}
}
var f=o.b.say;
f();
// 這里肯定有疑問了?為什么會指向o呢,不是應該指向b嗎?這時你應該注意到這里say沒有調用執(zhí)行,而是通過o.b.say賦值給變量f,然后才被執(zhí)行。這樣就指向o了。
function Fn(job){
this.job=job;
}
var i=new Fn("I am Engineer");
console.log(i.job);//I am Engineer
// 這里是一個構造函數,注意的是this指向構造函數new出來的對象。
// 首先new關鍵字會創(chuàng)建一個空的對象,然后會自動調用一個函數的一個方法,將this指向這個空對象,這樣的話函數內部的this就會被這個空的對象替代。
function Fn1(age){
this.age=age;
return {};
}
var ii=new Fn1("I am 21");
console.log(ii.age);//undefined
function Fn2(love){
this.love=love;
return function(){
}
}
var iii=new Fn1("My grilfriend is xqm");
console.log(iii.love)//undefined
function Fn3(like){
this.like=like;
return 1;
}
var iiii=new Fn3("I like playing CF")
console.log(iiii.like)//I like playing CF
// 當return一個對象時,打印出undefined。其他情況指向函數的實例。
針對上面一大堆的代碼和解釋是不是對this指向有點頭疼呢,當然上面的都是在函數體內的,還有其他情況的this指向這里沒說。
下面只是簡單的列舉
規(guī)律1 函數圓括號直接調用 函數上下文為window
規(guī)律2 函數作為對象的方法打點調用 函數上下文就是這個對象
規(guī)律3 函數作為事件的處理函數 函數上下文就是出發(fā)這個事件的對象
規(guī)律4 定時器調用函數 函數上下文為window
規(guī)律5 數組存放的函數 被數組索引調用 this就是這個數組
其實這五個規(guī)律前四個都涉及過,就是第五個沒有接觸過
function fun() {
console.log(this)
}
var arr=[fun,"a","a"];
arr[0]();
其實仔細總結,如果this在函數里面,那么它指向的是“函數執(zhí)行后”的上一級調用對象一直適用。
作者:Vam的金豆之路
主要領域:前端開發(fā)
我的微信:maomin9761
微信公眾號:前端歷劫之路