先聲明,本文站在巨人的肩膀上發散的思維。如題,首先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
就這些了,理解不到,還請指正。