本文僅採擷其中的一例:HTTP://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 中的 this 關鍵字,深入淺出的分析其在不同情況下的含義, 形成這種情況的原因以及 Dojo 等 JavaScript 工具中提供的綁定 this 的方法。 可以這樣說,正確掌握了 JavaScript 中的 this 關鍵字,才算邁入了 JavaScript 這門語言的門檻。
在 JAVA 等物件導向的語言中,this 關鍵字的含義是明確且具體的,即指代當前物件。 一般在編譯期確定下來,或稱為編譯期綁定。 而在 JavaScript 中,this 是動態繫結,或稱為運行期綁定的,這就導致 JavaScript 中的 this 關鍵字有能力具備多重含義,帶來靈活性的同時,也為初學者帶來不少困惑。 本文僅就這一問題展開討論,閱罷本文,讀者若能正確回答 JavaScript 中的 What ’s this 問題,作為作者,我就會211.html">覺得花費這麼多功夫,撰寫這樣一篇文章是值得的。
JAVA 語言中的 this
在 JAVA 中定義類經常會使用 this 關鍵字,多數情況下是為了避免命名衝突,比如在下面例子的中,定義一個 Point 類,很自然的,大家會使用 x,y 為其屬性或成員變數命名,在建構函式中,使用 x,y 為參數命名,相比其他的名字, 比如 a,b,也更有意義。 這時候就需要使用 this 來避免命名上的衝突。 另一種情況是為了方便的調用其他建構函式,比如定義在 X 軸上的點,其 x 值預設為 0,使用時只要提供 y 值就可以了,我們可以為此定義一個只需傳入一個參數的建構函式。 無論哪種情況,this 的含義是一樣的,均指當前物件。
清單 1. Point.java
public class Point { private int x = 0; private int y = 0; public Point(x, y){ this.x = x; this.y = y; } public Poin t(y){ this(0, y); } }
JavaScript 語言中的 this
由於其運行期綁定的特性,JavaScript 中的 this 含義要豐富得多,它可以是全域物件、當前物件或者任意物件,這完全取決於函數的調用方式。 JavaScript 中函數的調用有以下幾種方式:作為物件方法調用,作為函式呼叫,作為建構函式調用,和使用 apply 或 call 調用。 下面我們將按照調用方式的不同,分別討論 this 的含義。
作為物件方法調用
在 JavaScript 中,函數也是物件,因此函數可以作為一個物件的屬性,此時該函數被稱為該物件的方法,在使用這種調用方式時,this 被自然綁定到該物件。
清單 2. point.js
var point = { x : 0, y : 0, moveTo : function(x, y) { this.x = this.x + x; this.y = this.y + y; } }; point.moveTo(1, 1)//this 綁定到當前物件,即 point 物件
作為函式呼叫
函數也可以直接被調用,此時 this 綁定到全域物件。 在瀏覽器中,window 就是該全域物件。 比如下面的例子:函數被調用時,this 被綁定到全域物件,接下來執行設定陳述式,相當於隱式的聲明瞭一個全域變數,這顯然不是調用者希望的。
清單 3. nonsense.js
function makeNoSense(x) { this.x = x; } makeNoSense(5); x;// x 已經成為一個值為 5 的全域變數
對於內建函式,即聲明在另外一個函數體內的函數,這種綁定到全域物件的方式會產生另外一個問題。 我們仍然以前面提到的 point 物件為例,這次我們希望在 moveTo 方法內定義兩個函數,分別將 x,y 座標進行平移。 結果可能出乎大家意料,不僅 point 物件沒有移動,反而多出兩個全域變數 x,y。