this指向問題

JavaScript做爲一門面向對象的語言,this的指向一直是最基礎,也讓你們最頭疼的問題,下面就瞭解一下這個this。this指向最終調用它的那個對象,至於這句話怎麼理解,下面就直接來看實例吧!
情景一:函數

例1
function a () {
  var user = 'good'
  console.log(this.user) // 返回undefined
  console.log(this) // 返回window
}
a()

例2
 function a () {
    var user = 'good'
    console.log(this.user) //返回undefined
    console.log(this) // 返回window
 }
 window.a()this

詳解:this指向最終調用它的對象,這裏的函數a最終是被window對象所點出來的,例2就是很好的說明。user屬性是函數a的局部變量,window上面沒法訪問到屬性user,因此返回的是undefinedspa

情景二:
var o = {
  user: 'good',
  fn: function () {
    console.log(this.user) // 返回'good'
    console.log(this) // 返回 {user:'good',....}
  }
}
o.fn()

詳解:函數fn是被對象o調用,因此這裏的this指向對象o;code

情景三:
var o = {
  user:'good',
  fn: function () {
    console.log(this.user) // 返回'good'
    console.log(this) // 返回{user:'good',....}
  }
}
window.a.fn()

詳解:此處的this並非指向window,依然是指向a,和情景二的效果同樣對象

總結:
(1)若是函數中有一個this,可是並無被上一級的對象所調用,那麼this指向就是window
(2)若是函數中有一個this,而且被上一級對象所調用,那麼this就指向上一級的對象
(3)若是函數中有this,函數中包含多個對象,儘管函數被最外層的對象所調用,this指向的也是它上一級的對象blog

情景四:ip

var o = {
  a: 'good',
  b: {
    fn: function () {
      console.log(this.a) // 返回undefined
    }
  }
}
o.b.fn()

詳解:爲何返回undefined就有很好的解釋啦
情景五:io

var o = {
  a: 'good',
  b: {
    a: 'day',
    fn: function () {
      console.log(this) // 返回window
      console.log(this.a) // 返回undefined
    }
  }
}
var m = o.b.fn
m()

詳解:this永遠指向的是最後調用它的對象,也就是說最後是誰調用的它。函數fn是被對象b所引用,可是又將函數賦值給m,this指向永遠都是在調用的時候產生的,並非在建立的時候就產生的。最後是window調用了這個函數,那麼這樣全部的返回值就能夠解釋啦console

構建函數中的this
function Fn () {
  this.name = 'good'
}
var o = new Fn()
console.log(a.name) // 返回'good'

詳解:相信看到上述實例返回的值都沒什麼好驚訝的,可是爲何會返回這個值呢?是由於關鍵字new改變了this的指向,將this指向了對象o,而且將這個函數賦值給變量o,因此當讀取這個user屬性的時候,就能有返回值啦
當this遇到了returnfunction

情景六:
function Fn () {
  this.name = 'good'
  return {} // undefined
  return function () {} // undefined
  return 1 // ‘good’
  return null // 'good'
  return undefined // 'good'
}
var o = new Fn ()
console.log(o.name) 

詳解:函數裏面有this和return,當返回的是對象的時候,this指向返回的對象,若是是非對象的話,this就指向實例化的對象,可是null是個例外,雖然也是對象,可是this依然指向的是實例化的對象

相關文章
相關標籤/搜索