溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

javascript的this指向怎么理解

發(fā)布時間:2022-03-25 11:32:55 來源:億速云 閱讀:106 作者:iii 欄目:web開發(fā)

本文小編為大家詳細介紹“javascript的this指向怎么理解”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“javascript的this指向怎么理解”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

javascript的this指向怎么理解

this的指向

在我們看見的各種介紹如何判斷this的指向方法中,"this的最終指向的是那個調(diào)用它的對象" 這句話被視作核心,但是面對多種多樣的情況,我們?nèi)菀赘慊?。針對針對多種情況結(jié)合我的理解,我提出了一句話 “箭頭,定時和構(gòu)造,特殊情況特殊看,普通調(diào)用看點號,后面有點不看前,然后就近原則判,最后剩下就是window”。

箭頭函數(shù)

箭頭函數(shù)的本身沒有this,所有不存在this改變,它捕獲外層的this使用

var name = "windowsName";
var a = {
    name: "Cherry",
    fn() {
      setTimeout(()=>{
        console.log(this.name); 
      },0)
    }
}

a.fn() //Cherry

解析: 首先對象a調(diào)用fn函數(shù),所以fn函數(shù)的this指向?qū)ο骯,然后箭頭捕獲外層this,那么就不是setTimeout里的this,而是fn函數(shù)的this,所以最后拿到對象a里的name

定時器

對于延時函數(shù)內(nèi)部的回調(diào)函數(shù)的this指向全局對象window

var name = "windowsName";
var a = {
    name: "Cherry",
    fn() {
      setTimeout(function (){
        console.log(this.name); 
      },0)
    }
}

a.fn() //windowsName

解析: 首先對象a調(diào)用fn函數(shù),然后這里setTimeout里的回調(diào)函數(shù)是匿名函數(shù),為普通的函數(shù),那么匿名函數(shù)中的this指向的就是window

var name = "windowsName";
var b={
  name: "setTimeoutName"
}
var a = {
    name: "Cherry",
    fn() {
      setTimeout((function (){
        console.log(this.name); 
      }).bind(b),0)
    }
}

a.fn() //setTimeoutName

解析:首先對象a調(diào)用fn函數(shù),然后這里setTimeout里的回調(diào)函數(shù)是匿名函數(shù),為普通的函數(shù),那么匿名函數(shù)中的this指向的就是window,但使用bind改變匿名函數(shù)的this指向為對象b,所以最后對象b里的name

構(gòu)造函數(shù)

構(gòu)造函數(shù)中的this指向創(chuàng)建的實例對象,

注意:如果構(gòu)造函數(shù)中返回一個對象,創(chuàng)建時不會有新的實例對象,而是這個返回的對象

function fn(){
  this.age = 37;
}

var a = new fn();
console.log(a.age); // 37
a.age = 38;
console.log(fn); // { this.age = 37; }
console.log(a.age); // 38

解析:這里我們通過構(gòu)造函數(shù)創(chuàng)建實例對象a,相當于開辟一個新地方將構(gòu)造函數(shù)內(nèi)容復(fù)制過來,就有了a對象,這時候this指向的就是對象a,我們修改對象a中內(nèi)容不影響構(gòu)造函數(shù)

點號判斷

通過.判斷this指向,遵循就近原則

var a = {
  age:10,
  b: {
      age:12,
      fn(){
          console.log(this.age); 
      }
  }
}
a.b.fn(); //12

解析:對象a調(diào)用對象b的fn函數(shù),fn函數(shù)前面有兩個.,那么最近的是對象b,所以fn函數(shù)的this指向的就是對象b,最后拿到的就是對象b的age

var a = {
  age:10,
  b: {
      age:12,
      fn(){
          console.log(this.age); //undefined
      }
  }
}
var c = {
  age:20,
}

var d = {
  age:30,
}
a.b.fn.bind(c).bind(d)(); //20

解析:對象a調(diào)用對象b的fn函數(shù)然后使用bind改變this的指向,這時候fn前后前后都有.,不看前面的.,只用看后面的,然后最近的bind改變this指向為c,那么此時fn函數(shù)的this指向的就是對象c,拿到的就是對象c的age

練習(xí)

function outerFunc() {
   console.log(this) // { x: 1 }
   function func() {
    console.log(this) // Window 
   }
   func()
} 

outerFunc.bind({ x: 1 })()
obj = {
  func() {
    const arrowFunc = () => {
      console.log(this._name)
    }

    return arrowFunc
  },

  _name: "obj",
}

obj.func()() //obj

func = obj.func
func()()  //undefined

obj.func.bind({ _name: "newObj" })()() //newObj

obj.func.bind()()() //undefined

obj.func.bind({ _name: "bindObj" }).apply({ _name: "applyObj" })() //bindObj

apply、call、bind

使用 apply、call、bind 函數(shù)可以改變this的指向,上面this的例子中使用到

區(qū)別

thisArg , [ argsArray] call(thisArg, arg1, arg2, ...)

apply和call函數(shù)區(qū)別在于this后面?zhèn)魅氲膮?shù),apply中傳的是一個數(shù)組,而call中傳入的是展開的參數(shù)

bind(thisArg[, arg1[, arg2[, ...]]])()

  • 然后bind函數(shù)創(chuàng)建的是一個新的函數(shù),需要手動去調(diào)用

  • 這個新函數(shù)的 this 被指定為 bind() 的第一個參數(shù),而其余參數(shù)將作為新函數(shù)的參數(shù),供調(diào)用時使用

讀到這里,這篇“javascript的this指向怎么理解”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI