一般用來解釋this的例子是根據
var foo=function(){
console.log(this.name)
}
obj={
name:'內部',
print:foo
}
直接調用
1 執行方式 foo()
打印undefined,由於直接調用時 this 指向window,全局未定義name 因此打印undefined
2 執行方式 obj.print()
打印 '內部',由於這種方式調用時,this指向的是obj對象,obj內定義了name屬性,因此打印出內部
上面的解釋結束了。
假如代碼是這個樣子的,會如何執行
var foo=function(){
this.name='方法'
console.log(this.name)
}
obj={
name:'內部',
print:foo
}
仍是兩種方式調用
foo() 打印 ‘方法’;以下圖,由於直接調用時,this指向的window,
至關於給全局環境定義了name屬性,因此,console.log(this.name);打印出全局的變量name

obj.print() 打印 ‘方法’;以下圖,由於obj.print();調用時foo函數內的this指向確實是obj對象,
可是this.name='方法',執行以後,至關於把obj內部變量name從新賦值了,因此依然打印‘方法’

總結一下,其實無論foo方法內部加不加this.name='方法'這一行代碼;
兩種方式先後,this指向都是同樣的。
只是,在obj指向的基礎上,針對賦值發生了變化而已。
以上是針對函數內部修改後
假如咱們將函數修改成箭頭函數呢,
var foo=()=>{
debugger;
this.name='方法'
console.log(this.name)
}
obj={
name:'內部',
print:foo
}
由於箭頭函數是,定義時決定this指向,
foo函數是在全局環境中定義的,因此this指向會一直指向window
驗證一下
obj.print()
this 果真指向了window而不是obj