douglas crockford大師把this古怪的行為解釋為和函式的呼叫模式有關。js中有
1)方法模式:簡單的說就是使用點表示式或是下標表示式來呼叫 這裡定然是有物件的 這種情況下 this的繫結發生在呼叫的時候 綁的自然是調它的那個物件了。
作為方法呼叫的函式有乙個非常重要的屬性:在方法體中,用來呼叫方法的物件成為關鍵字this的值。
2)函式模式:這個就更簡單了,函式名加呼叫運算子('()')。不過要小心,這個this綁的可是全域性物件,不管你寫哪了。(可以理解成 你不給我指明了 我就自己給它加個全域性物件)
當乙個函式作為函式呼叫而不是方法呼叫時,這個this關鍵字引用全域性物件。容易混淆的是,當乙個巢狀的函式(作為函式)在乙個包含的函式中呼叫,而這個
包含的函式是作為方法呼叫的,這也是成立的:this關鍵字在包含的函式中有乙個值,但是它卻(不太直觀地)引用巢狀的函式體的內部的全域性物件。
看個例子吧
var a = 'global';
var obj =
alert(this.a);//local
test1();}};
obj.test();
/*****************************解決這個問題的方法*****************************/
var a = 'global';
var obj =
alert(this.a);//local
test1();}};
obj.test();
3)構造器呼叫模式 一句話就是用new來呼叫的 new的時候this就繫結到新物件上了 比較好理解
(1)new運算子後面必須跟著乙個函式呼叫。new建立了乙個新的沒有任何屬性的物件,然後呼叫該建構函式,把新的物件作為this關鍵字的值傳遞。
(2)建構函式通常沒有返回值。它們初始化作為this的值來傳遞的物件,並且沒有返回值。但乙個構造是允許返回乙個物件值,並且如果它這麼做,返回的物件成為new表示式的值。在此情況下,作為this的值的物件會被拋棄。可參考jquery建構函式。
直譯器模式(行為型)
定義 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,該直譯器使用該表示來解釋語言中的句子。結構 適用場景 uml類圖 下面就是直譯器模式的 實現 expression public inte ce expression nonterminalexpression public class ...
行為型模式 直譯器
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。直譯器模式 interpreter 是一種針對特定問題設計的一種解決方案。例如,匹配字串的時候,由於匹配條件非常靈活,使得通過 來實現非常不靈活。舉個例子,針對以下的匹配條件 因此,需要一種通用的表示方法...
行為型模式 直譯器
直譯器模式 interpreter 是一種針對特定問題設計的一種解決方案。例如,匹配字串的時候,由於匹配條件非常靈活,使得通過 來實現非常不靈活。舉個例子,針對以下的匹配條件 因此,需要一種通用的表示方法 正規表示式來進行匹配。正規表示式就是乙個字串,但要把正規表示式解析為語法樹,然後再匹配指定的字...