前端js -- this指向總結。

面向對象編程 --- this指向

一。首先:,編程

this的指向在函數定義的時候是肯定不了的,只有函數執行的時候才能肯定this到底指向誰,實際上this的最終指向的是那個調用它的對象。

二。例如:app

var obj = {
   a : 1,
   b : function() { 
       console.log(this.a) 
   }
}

obj.b()時,會輸出1
var fun = obj.b; fun() 時,會輸出undefined函數

三。緣由:
1.obj.b()這裏的this指向的是對象o,由於你調用這個fn是經過o.fn()執行的,那天然指向就是對象o
2.this

var fun = obj.b;
fun();

至關於,code

var b = function(){ 
   console.log(this.a)
};
obj = {
   a:1,
   b:b
};
var fun = obj.b;
fun();

雖然funobj.b的一個引用,可是實際上,他引用的是b函數自己,所以此時的fun()實際上是一個不帶任何修飾的函數調用,只是在將fn賦值給變量j的時候並無執行因此最終指向的是window對象

四。總結: this的值要等到代碼真正執行是才能肯定。
同時,this的值有以下幾種狀況:
1.new調用時指的是被構造的對象。(io

function Fn(){
   this.user = '貓咪'
}; 
var a = new Fn(); 
consle.log(a.user); //貓咪

這裏之因此對象a能夠點出函數Fn裏面的user是由於new關鍵字能夠改變this的指向,將這個this指向對象a,爲何我說a是對象,由於用了new關鍵字就是建立一個對象實例,咱們這裏用變量a建立了一個Fn的實例[至關於複製了一份Fn到對象a裏面],此時僅僅只是建立,並無執行,而調用這個函數Fn的是對象a,那麼this指向的天然是對象a,那麼爲何對象a中會有user,由於你已經複製了一份Fn函數到對象a中,用了new關鍵字就等同於複製了一份。)
2.callapply調用,只想咱們指定的對象(後續更新)。
3.對象調用,如執行obj.b()this指向obj
4.默認的,指向全局變量windowconsole

特殊:構造函數版this, 當this碰到return時。
  1. 舉例:

(1).面向對象編程

function fn()  { 
     this.user = '金毛'; 
     return {};
 }; 
 var a = new fn;  
 console.log(a.user); //undefined

(2).function

function fn()  {   
    this.user = '金毛';    
    return function(){};
}; 
var a = new fn;  
console.log(a.user); //undefined

(3).

function fn()  {  
    this.user = '金毛';   
    return 1;
}; 
var a = new fn;  
console.log(a.user); //金毛

(4).

function fn()  {  
    this.user = '金毛';  
    return undefined;
}; 
var a = new fn;  
console.log(a.user); //金毛

2.總結:若是返回值是一個對象,那麼this指向的就是那個返回的對象,若是返回值不是一個對象那麼this仍是指向函數的實例。

3.特殊:雖然null也是對象,可是在這裏this仍是指向那個函數的實例,由於null比較特殊。

function fn()  {  
    this.user = '金毛';  
    return null;
}; 
var a = new fn;   
console.log(a.user); //金毛
相關文章
相關標籤/搜索