在此,我假設您已經在運用Javascript中的類概念,假設您還了解OOP中的this.

還是習慣從實例來分析:

 

var someObject = {};
function someMethod(){
 alert((
this==window)+','+(this==someObject));
}

someObject.someMethod 
= someMethod;
someMethod();
//true,false
someObject.someMethod();//false,true

 

上面的代碼是定義了一個function和一個對象,并指定對象的某個屬性為那個function;

在執行方法時我們知道,可以通過someObject.someMethod()這樣調用,也可以通過someMethod()這樣直接調用;
歸根結底,這兩種調用方式都能找到相應內存中的function-someMethod(有名方法),并執行。
但由于this在Javascript中的特殊性,這兩種調用方式的輸出卻截然不同,前者返回false,true,而后者返回true,false,why?

網上有很多描述,我在此以我的理解作一個直白的描述,在需要JS處理機區分this時,方法由誰調用,則this表示誰。(之后會說明不需要JS處理機區分的情況)
someObject.someMethod()調用者為someObject,所以this==someObject返回true;
someMethod()呢?對window有所理解的人應該知道,Javascript頁面級的作用域為window,即缺省有名對象都相當于window的一個屬性,如定義var a;相當于指定window.a屬性,定義function b同樣相當于指定window.b屬性。所以someMethod()的調用相當于window.someMethod()調用,調用者為window,所以this==window返回true;

若是只有這樣,可能大家還是比較容易理解,在Javascript中還存在兩個特殊方法,Function.call和Function.apply。
這兩個方法的調用者為someFunction,參數分別為:
call(oCaller,arg1,arg2,...)
apply(oCaller,[arg1,agr2,...])
這兩個方法可以顯式的告訴JS處理機,執行someFunction中的this對象為我的第一個參數oCaller,這也就是我之前提到的不需要JS處理機區分的情況;
有興趣的同學可以試運行以下的實例:

 

var someObject = {};
var someObject2 = {};
function someMethod(){
 alert((
this==window)+','+(this==someObject)+','+(this==someObject2));
}

someObject.someMethod 
= someMethod;
someMethod();
//true,false,false
someObject.someMethod();//false,true,false
someMethod.apply(someObject);//or call//false,true,false
someMethod.apply(someObject2);//false,false,true

還有一種特殊情況,new操作符處理函數,new操作符會創建一個新對象,將this指向這個新對象,然后進行操作,所以其中的this不表示任何已知句柄的對象,而是一個新的匿名對象,通過賦值語句可以指定給某個變量或者對象屬性上,在此不再多作蟄述,試運行以下示例;

 

var someObject = {};
function ClassA(){
 alert((
this==window)+','+(this==someObject));
 
this.someAttr = 'someAttr';
}

someObject 
= new ClassA();//false,false
alert(someObject.someAttr);//someAttr