一:全局環境中的this指的是window對象 二:作為對象的方法調用 當函數作為對象的方法被調用時,this指向該對象 例子: 三:作為普通方法調用 當函數不作為對象的屬性被調用,而是作為普通函數函數被調用,this指向全局對象,也就是window 例子1: 此時this是指向window對象。
一:全局環境中的this指的是window對象
二:作為對象的方法調用
當函數作為對象的方法被調用時,this指向該對象
例子:
三:作為普通方法調用
當函數不作為對象的屬性被調用,而是作為普通函數函數被調用,this指向全局對象,也就是window
例子1:
此時this是指向window對象。
如上圖運行結果可以看出,在函數內部定義變數,未使用var 聲明,則指向全局變數。可以對比結果
例子2:
如上圖所示,作為普通函數調用時,this指向window 。作為對象屬性調用時,this指向該對象。this是在對象內部函數定義的,但是調用的時候是作為普通函數調用,多以this依然指向window。
this的指向,是根據調用時的環境,而非定義時的環境。
以前看閉包的資料時,看到思考題,當時還似懂非懂,出處http://www.jb51.net/article/24101.htm
六、思考題
如果你能理解下麵代碼的運行結果,應該就算理解閉包的運行機制了。
Js代碼
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); //The Window
這個思考題的執行結果,如圖所示:
第一步 object.getNameFunc() 結果是一個匿名函數,object.getNameFunc()()第二個括弧調用匿名函數,並執行。此時是作為普通函數被調用的,所以this是指向全局變數,所以name輸出為The window 。這裡的結果應該是跟this有關係,但是現在還是不太清楚,作者把這道題目寫在閉包的這個位置的意圖,得再研究研究。
四:改變this指向,關於call()和apply();
跟普通函數的調用相比,用call()或者apply()可以改變傳入的this;
c
參考資料:《JavaScript設計模式與開發實踐》 曾探
未完待續
18:00:54