1. 程式人生 > >js中this的指向

js中this的指向

關於this的指向問題

普通函式中this永遠指向函式執行時所在的物件,也就是說this指向的是最終呼叫它的物件

下面為具體情況:

1.通過函式名直接呼叫的,this指向window

function a(){
    var user = "johnny";
    console.log(this.user); //undefined
    console.log(this); //Window
}
a();

2.通過物件呼叫的,this指向最終呼叫它的物件

var name = "pharaoh"

var obj = {
    name:"johnny",
    getName:function(){
        console.log(this.name);
    }
}

window.obj.getName();//johnny

如果一個函式中有this,這個函式有被上一級的物件所呼叫,那麼this指向的就是上一級的物件,注意此處,最終呼叫的還是函式的還是obj物件,所以輸出johnny

這裡還有一種特殊情況,

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window
        }
    }
}
var j = o.b.fn;
j();

這裡this指向的是window,因為this指向的是最終呼叫它的物件,j是屬於window的

3.函式作為建構函式,用new關鍵字呼叫時:this指向新new出的物件

function Fn(){
    this.user = "johnny";
}
var a = new Fn();
console.log(a.user); //johnny

這裡之所以物件a可以點出函式Fn裡面的user是因為new關鍵字改變了this的指向,相當於把Fn物件複製了一份給了a,因此a能點出user

4.一些有意思的程式碼

function a(xx){
    this.x=xx;
    return this
};
var x=a(5);
var y=a(6);
console.log(x.x);
console.log(y.x);
//輸入undefined  6
//var x=a(5);此時 x=window,y=undefined
//var y=a(6);此時 x=6,y=window(呼叫a函式時this指向window,所以window.x=6,return window,所以y=window)
//console.log(x.x);//實際是6.x,就是undefined
//console.log(y.x);//實際是window.x,就是6;
var length = 10;
function fn() {
    alert(this.length);
}
 
var obj = {
  length: 5,
  method: function(fnn) {
	  
    fnn();
  }
};
	
obj.method(fn) //輸出10