JS回調函數中的 this 指向(詳細)
- 2019 年 11 月 12 日
- 筆記
首先先說下正常的 this 指向問題
什麼是 this:自動引用正在調用當前方法的.前的對象。
this指向的三種情況
1. obj.fun() fun 中的 this->obj ,自動指向.前的對象
2. new Fun() Fun 中的 this->正在創建的新對象,new 改變了函數內部的 this 指向,導致 this 指向實例化 new 的對象
3. fun() 和匿名函數自調 this 默認->window,函數內部的 this,this 默認是指向 window 的
再說回調函數中的 this 指向問題,我們先來看一個例子
1 <script> 2 var Bob={ 3 sname:"鮑勃", 4 friends:["Jack","Rose","Tom","Jerry"], 5 intr(){ 6 this.friends.forEach(function(ele){ 7 console.log(this.sname+"認識"+ele); 8 }); 9 } 10 } 11 Bob.intr(); 12 </script>
看結果:
undefined認識Jack undefined認識Rose undefined認識Tom undefined認識Jerry
回調函數中的this默認是指向window的,因為本質上是在函數內callback,並沒有.前的對象調用
如何解決:
使用箭頭函數
1<script> 2 var Bob={ 3 sname:"鮑勃", 4 friends:["Jack","Rose","Tom","Jerry"], 5 intr(){ 6 this.friends.forEach(ele=>{ 7 console.log(this.sname+"認識"+ele); 8 }); 9 } 10 } 11 Bob.intr(); 12 </script>
結果是:
鮑勃認識Jack 鮑勃認識Rose 鮑勃認識Tom 鮑勃認識Jerry
可以看出箭頭函數內的this自動指向了回調函數外層的 this 。
箭頭函數中的 this:
函數體內的 this 對象,就是定義時所在的對象,而不是使用時所在的對象。
this 指向的固定化,並不是因為箭頭函數內部有綁定 this 的機制,實際原因是箭頭函數根本沒有自己的 this,導致內部的 this 就是外層程式碼塊的 this。正是因為它沒有 this,所以也就不能用作構造函數。
也可使用bind永久綁定this
1 var Bob={ 2 sname:"鮑勃", 3 friends:["Jack","Rose","Tom","Jerry"], 4 intr(){ 5 this.friends.forEach(function(friend){ 6 console.log(this.sname+"認識"+friend); 7 }.bind(this)); 8 } 9 } 10 Bob.intr();