由於其運行期綁定的特性,JavaScript 中的this 含義要豐富得多,它可以是全域對象、當前對像或任意對象,這完全取決於函數的調用方式。 JavaScript 中函數的調用有以下幾種方式:作為物件方法調用,作為函數調用,作為構造函數調用,和使用 apply 或 call 調用。下面我們將依照呼叫方式的不同,分別討論 this 的意思。
在JavaScript 中,函數也是對象,因此函數可以作為一個對象的屬性,此時該函數被稱為該對象的方法,在使用這種調用方式時,this 被自然綁定到該物件。
#1 ##2 |
x : 0, y : 0, moveTo : function(x, y) { #this.x = this.x + x;
#this.y = this.y + y;
#}
};
#point.moveTo(1, 1)//this 綁定到目前對象,即point 物件
| #作為函數呼叫
456 #function makeNoSense(x) { | this.x = x; } makeNoSense( 5);
x;// x 已成為一個值為5 的全域變數
##
對於內部函數,也就是宣告在另一個函數體內的函數,這種綁定到全域物件的方式會產生另外一個問題。我們仍然以前面提到的 point 物件為例,這次我們希望在 moveTo 方法內定義兩個函數,分別將 x,y 座標進行平移。結果可能出乎大家意料,不只 point 物件沒有移動,反而多出兩個全域變數 x,y。 清單4.point.js
這屬於JavaScript 的設計缺陷,正確的設計方式是內部函數的this 應該綁定到其外層函數對應的物件上,為了規避這個設計缺陷,聰明的JavaScript 程式設計師想出了變數替代的方法,約定俗成,該變數一般被命名為that。 清單5. point2.js
作為建構子呼叫JavaScript 支援物件導向程式設計,與主流的物件導向程式語言不同,JavaScript 並沒有類別(class)的概念,而是使用基於原型(prototype)的繼承方式。對應的,JavaScript 中的建構函數也很特殊,如果不使用 new 調用,則和普通函數一樣。作為另一個約定俗成的準則,建構函式以大寫字母開頭,提醒呼叫者使用正確的方式呼叫。如果呼叫正確,this 綁定到新建立的物件上。 清單6. Point.js
|
以上是js中關於this的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!