1. 程式人生 > >關於js中的this指向問題

關於js中的this指向問題

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