關於js中的this指向問題
阿新 • • 發佈:2019-01-01
js開發中多多少少都會遇到this指向問題,多少會有些懵圈,只要記住一句核心的話,哪個物件呼叫函式,this就指向哪個物件
呼叫函式一般有以下這麼多中情況:
1,普通函式呼叫
毫無疑問,此時this指向的是window物件
var username='守候'
function fn(){
alert(this.username);//守候
}
fu();
//---------------
window.username='守候'
function fn(){
alert(this.username);//守候
}
fn();
//可以理解為
//window.fn();
2,物件中的函式呼叫
這個不難理解,哪個物件呼叫這個函式,this就指向哪個物件
window.b=2222
let obj={
a:111,
fn:function(){
alert(this.a);//111
alert(this.b);//undefined
}
}
obj.fn();
3,建構函式呼叫
建構函式中的this 指向的就是建構函式本身
let TestClass=function(){ this.name='111'; } let subClass=new TestClass(); subClass.name='守候'; console.log(subClass.name);//守候 let subClass1=new TestClass(); console.log(subClass1.name)//111
4,apply call 呼叫
call apply會改變傳入函式的this,this會指向call的引數
let obj1={
a:222
};
let obj2={
a:111,
fn:function(){
alert(this.a);
}
}
obj2.fn.call(obj1);
5,箭頭函式:
箭頭函式裡,沒有this
第一種情況:setTimeOut()中傳入的是普通函式,所以this會指向window物件,而在window物件中沒有window.a這個屬性
因此console的undefind
第二種情況: setTimeOut()傳入的是箭頭函式,箭頭函式沒有this,因此就去外層尋找this,指向了obj物件
let obj={
a:222,
fn:function(){
setTimeout(function(){console.log(this.a)})
}
};
obj.fn();//undefined
let obj={
a:222,
fn:function(){
setTimeout(()=>{console.log(this.a)});
}
};
obj.fn();//222