https://paper.dropbox.com/doc/1129-JavaScript-this-Closure-7Boanrz9AnAjqqRboh123
http://idoc.hexschool.com/tobejsfighter/2017-12-12-javascript-this.html
影響 this 的是在於函式的呼叫方法,並非宣告的時機宣告的位置不重要:
過去我們在寫物件內的函式時,為了確保 this 能夠正確運作會先將它賦予在另一個變數上 (that, self, vm…)。
純粹的調用 (Simple call)
如果直接調用函式,此函式的 this 會指向 window
物件的方法調用 (As an object method)
如果 function 是在物件下調用,那麼 this 則會指向此物件,無論 function 是在哪裡宣告。
DOM 物件調用 (As a DOM event handler)
DOM 調用 function 就如同物件調用 function,所以此 this 所指向的則是 DOM
建構式的調用 (As a constructor)
在建構式下會 new 一個新物件,此時的 this 會指向新的物件
使用 Call,Bind,Apply 來呼叫 function
可以傳入新的this給予函式使用,三者僅是使用方法不同
call調用的函式可以直接傳入新的物件,使其作為 this 所指向的物件。
重新指向 this( IIFE, setTimeout )
在實際運作時,立即函式 (IIFE) 或是非同步的事件 (setTimeout) 大多都會指向全域,如果需調用的則是物件本身的話,可以先用一個變數指向this,等到調用後再重新使用它。這個變數名稱可以自己定義,常見有 that、vm、self 等等,可以使用自己或團隊習慣的為主即可。