爲什麼在vue中的methods中箭頭函數的this指向undefined

先聲明,本文站在巨人的肩膀上發散的思維。如題,首先this不會是vm,這一點很篤定。但爲何是undefined不是window,想着有些困惑。

搞明白這個,首先得曉得這幾個前提:

1.箭頭函數的this是在定義函數時繼承了其父級作用域的this,不是在執行過程中綁定的。

2.vue默認開啓了嚴格模式。

3.全局作用域下的函數中使用this,在嚴格模式下this指向undefined

以上三點爲前提,可以印證。

瞭解這三條,再去看一下vue的源碼,有這麼一段:

function initMethods (vm: Component) {  
    const methods = vm.$options.methods  
    if (methods) {    
        for (const key in methods) {
          //這一行是重點 
          vm[key] = methods[key] == null ? noop : bind(methods[key], vm)   
   
          if (process.env.NODE_ENV !== 'production' && methods[key] == null) {
                //...這一段是容錯信息 不用管
          }
    }
  }
}

可以看到重點的那一句,其實是把methods中的函數直接動態綁定到了vue實例vm上。而這個操作是在全局函數initMethods中執行的,此函數中的this爲在嚴格模式下爲undefined。由此導致我們在mehtods中使用箭頭函數的this時,爲undefined。

依樣可以寫個小測試,加深下理解

    "use strict";
    let vm={}
    function init(vm){
        vm["handle"]=_=>{
            console.log(this)
        }
    }
    init(vm)
    vm.handle()  //輸出 undefined

就這些了,理解不到,還請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章