1. 程式人生 > >JavaScript this的指向問題

JavaScript this的指向問題

實例 all 它的 cal 會有 bsp con scrip clas

this的指向

在函數創建的時候,this的指向還未確定,它最終指向調用它的對象

window.onload=function(){
  window.a="我的曾經"
  function da(){
    console.log(this.a)
  }
  da()  //我的曾經
}

解:window對da()函數進行調用,故this指向window

window.onload=function(){
  window.a="我的曾經"
  var bn={
    a:"小白",
    da:function(){
      console.log(this.a)
    }


  }
  bn.da()  //小白
}

解:bn對象對da()函數進行調用,故this指向window

window.onload=function(){
  window.a="我的曾經"
  var a="小白"
  var bn={
        a:"大白",
        da:{
            //a:"打包",
            b:function(){
                console.log(this.a) 
            }
        }
  }
  bn.da.b()  //undefined
}

解:da對象調用b()函數,故this指向da

window.onload=function(){
  window.a="我的曾經"
  var a="小白"
  var bn={
        a:"小白",
        da:{
            a:"打包",
            b:function(){
                console.log(this.a) 
            }
        }
  }
    var hk=bn.da.b
  hk()  //我的曾經
}

解:var hk=bn.da.b這句話,將b()函數賦值hk,所以它調用的是window.hk(),故this指向window

構造函數的this指向

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

解:new關鍵字就是創建一個對象實例,所以a是個對象,所以函數this()被對象a調用,那麽this指向的自然是對象a,對象a中會有user,是因為new關鍵字於復制了一份this()函數

function fu(){  
    this.user = "武器";  
    return {};  
}
var a = new fu;  
console.log(a.user); //undefined
function fu(){
  this.name="大叔";
  return 25; 
}
var a=new fu;
console.log(a.name)  //大叔

解:如果返回值是一個對象,那麽this指向的就是那個返回的對象,如果返回值不是一個對象那麽this還是指向函數的實例,如果return null,雖然null也是對象,但是在這裏this還是指向那個函數的實例

call()

var a = {
    user:"hhh",
    fn:function(a,b){
        console.log(this.user); //hhh
        console.log(a+b); //8
    }
}
var b = a.fn;
b.call(a,3,5);

解:call() 方法,它的第一個參數當做作 this 的對象。即this指向a,其他參數都直接傳遞給函數自身即b

apply()

var a = {
    user:"hhh",
    fn:function(a,b){
        console.log(this.user); //hhh
        console.log(a+b); //11
    }
}
var b = a.fn;
b.apply(a,[3,5]);

解:apply() 方法有兩個參數,用作 this 的對象和要傳遞給函數的參數的數組

bind()

var a = {
    user:"hhh",
    fn:function(aa,bb,cc){
        console.log(this.user); //hhh
        console.log(aa,bb,cc); //1 2 3
    }
}
var b = a.fn;
var c = b.bind(a,1);
c(2,3);

解:bind() 方法,它其實返回一個函數,它的第一個參數當做作 this 的對象。即this指向a,其他參數按順序都傳遞給函數自身即b

this指向的應用

window.onload=function(){
    var bn={
        fn:function fn(){  
            function hj(){
                console.log(this)
            }
            hj()
        },
        gn:function gn(){  
            function hj(obn){
                console.log(obn)
            }
            hj(this)
        },
        bn:function bn(){
            var that=this
            function hj(){
                console.log(that)
            }
            hj()
        }
    }
    bn.fn()    //window
    bn.gn()  //gn
    bn.bn()  //bn
}

正常情況,函數嵌套函數,裏面函數的this指向window,那我們需要他指向嵌套他的函數時有兩種方法;1:將this作為參數傳遞到被嵌套的函數裏,2:將this賦值給一個變量,讓被嵌套函數進行調用

JavaScript this的指向問題