深入淺出JavaScript中的this

來源:互聯網
上載者:User
關鍵字 JavaScript

本文僅採擷其中的一例: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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.