關於this的誤解
首先,this並不是像它的英語意思一樣指向函數本身
來看個例子
function showThis(){
this.count++;
console.log(this.count);
}
showThis.count=0;
showThis();//NaN
console.log(showThis.count);//0
如果this指向調用函數本身的話
輸出的應該是1纔對,爲什麼調用時輸出的是NaN和0呢?
這段代碼中,showThis.count確實給showThis創造了一個count屬性並賦值爲0
但是執行函數的時候this指向的是window對象,也就是說調用的實際上是window.showThis() (因爲showThis被聲明在全局作用域)
第二種常見的誤解是,this指向函數的作用域
首先確定一點,this在任何情況下都不指向函數的詞法作用域
JavaScript中的作用域確實和對象類似,可見的標識符都是它的屬性
但是作用域"對象"無法通過JavaScript代碼訪問,它存在在JavaScript引擎內部
this是什麼
首先,this是在運行時進行綁定的,與作用域不同,作用域是在定義時綁定,與執行位置無關
因此,this的綁定和函數聲明的位置沒有任何關係,只跟調用函數的方式有關
當一個函數被調用時,會創建一個活動記錄(執行上下文)
包括了函數在哪裏調用(調用棧),調用方式,傳入的參數等
this就是這個記錄的一個屬性
因此,this實際上是在函數被調用時發生的綁定,指向什麼完全取決於函數在哪裏被調