函數調用模式中的this

以前讀語言精粹的時候一直對函數的調用的理解是模模糊糊,只知其一;不知其二。尤爲是 函數調用模式 更是一頭霧水。終於今天讓我遇到這個問題了,總算是對函數調用模式this 有了一個相對來講比較清楚的認識。java

javascrit中的this有一個特性就是:運行期綁定(不包括箭頭函數),因此this能夠是 全局對象當前對象 或者 任意對象這徹底取決於函數的調用方式函數

函數調用模式中的this

以此模式調用函數時, this 會被綁定到全局對象。這是一個語言上的設計錯誤。舉個栗子:this

var Chat = {
    func1 () {
        //...
        this.func2()    //這裏會報錯: func2 is not a function
     }
    func2 () {
        //...
    }
}

出現這種錯誤的緣由就是,this 沒有綁定到Chat對象上,而是綁定到全局對象上了。致使,方法不能利用內部函數。設計

解決方法一:code

var Chat = {
    func1 () {
        //定義一個變量that賦值給this,那麼內部函數能夠經過that訪問到this
        var that = this      
        this.func2()    
     }
    func2 () {
        //...
    }
}

解決方法二:對象

var Chat = {
    func1 (){
        Chat.func2()      //誰的方法,誰調用  
     }
    func2 () {
        //...
    }
}

箭頭函數中的this

function taskA() {
  this.name = 'hello'

  var fn = function() {
    console.log(this)
    console.log(this.name)
  }

  var arrow_fn = () => {
    console.log(this)
    console.log(this.name)
  }
  fn()
  arrow_fn()
}
taskA()

首先根據 詞法做用域 ,因爲它自己沒有this,因而便向上查找this。接下來,發現taskA是有this的,因而便直接繼承了taskA的做用域。繼承

那麼,問題來了:taskA的this又是什麼呢?
taskA是一個普通函數,普通函數的this是在運行時決定的,因爲咱們是直接調用taskA的,即taskA(),因此其this即是window。因此,在這個例子中,arrow_fn中的this是window作用域

因此,綜上所述:箭頭函數中的this是定義的時候就決定的。另外,還須要注意的一點是:它的 this 指向是不可改變的it

相關文章
相關標籤/搜索