徹底弄懂this指針指向

普通函數(shù)的this指向

  • 全局this
console.log(this) // window

function globalFunc() {
  console.log(this) // window
}

globalFunc() // 相當(dāng)于window.globalFunc(), 全局方法就是window在調(diào)用,所以指向window

在瀏覽器中指向window

  • 函數(shù)(this指向調(diào)用者)
var obj = {
  clg: function() {
    console.log(this)
  }
}

obj.clg() // this = obj

對象調(diào)用方法指向該對象

var a = 5
var obj = {
  a: 10,
  clg: function() {
    console.log(this.a)
  }
}

var func = obj.clg
func() // a = 5, this === window

因為函數(shù)其實是地址,obj.clg賦值給func,其實是將函數(shù)地址賦值給func,函數(shù)只有一份,obj.clg()是通過對象尋址到函數(shù)的,是對象調(diào)用的,所以this指向obj,而func()是window.func尋址到的函數(shù),是window調(diào)用的,所以指向window,也就是誰調(diào)用,this指向誰

var a = 5
var obj = {
  a: 10,
  clg: function() {
    function func() {
      console.log(this)
    }
    func() // 指向window,沒有對象調(diào)用就相當(dāng)于window調(diào)用的
  }
}

obj.clg()
var a = 5
var obj = {
  a: 10,
  clg: function() {
    setTimeout(function() {
      console.log(this)
    }, 500)
  }
}

obj.clg()

func沒有被對象調(diào)用,所以是window調(diào)用的,this指向window

  • 箭頭函數(shù)(箭頭函數(shù)沒有this指針,根據(jù)詞法作用域找最近的this,只有函數(shù)有this)
    詞法作用域是指找到作用域鏈中最近的一個變量,this和argument是函數(shù)才有的局部變量
var obj = {
  arrow: {
    func: () => {
      console.log(this) // window
    }
  }
}

obj.arrow.func()

箭頭函數(shù)沒有this指針,會根據(jù)詞法作用域進(jìn)行查找,對象也沒有this指針,所以func對象和arrow對象都沒有this局部變量,所有this找到了window上

var obj = {
  arrow: function() {
   setTimeout(() => {
     console.log(this) // obj
   }, 500)
  }
}

obj.arrow()

箭頭函數(shù)沒有this,通過詞法作用域,找到arrow為函數(shù),有this,則其this為arrow的this,arrow是obj調(diào)用的,所以this指向obj,所以箭頭函數(shù)的this指向obj

  • call/apply/bind
var a = 1
var obj1 = {
  a: 2
}

var obj2 = {
  a: 3
}

function clga() {
  console.log(this.a)
}

clga() // 1
clga.call(obj1) // 2
clga.apply(obj1) // 2
var f = clga.bind(obj2)
f() // 3

均可以修改this對象,注意apply和call都會執(zhí)行函數(shù),bind只是綁定this,但是bind之后,不論賦值給誰,調(diào)用的時候,this都會指向綁定的對象,所以此時f()中的this不是指向window而是指向obj2

注意: 當(dāng)需要多個this的時候,可以使用that或者_(dá)this等保存對應(yīng)的this,然后通過詞法作用域,內(nèi)部都可以拿到這個this

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容