Javascript學習筆記之 函數篇(二) : this 的工作機制

來源:互聯網
上載者:User

全域範圍下

this;
當在全域範圍中使用 this,它指向全域對象。
這裡詳細介紹下全域對象:

全域對象(Global object) 是在進入任何執行內容之前就已經建立了的對象;
這個對象只存在一份,它的屬性在程式中任何地方都可以訪問,全域對象的生命週期終止於程式退出那一刻。
全域對象初始建立階段將 Math、String、Date、parseInt 作為自身屬性,等屬性初始化,同樣也可以有額外建立的其它對象作為屬性(其可以指向到全域對象自身)。例如,在 DOM 中,全域對象的 window 屬性就可以引用全域對象自身。
所以在 console 內輸入 window 和 this.window 是一樣的。

調用一個函數時

foo();
在這裡,this 同樣指向全域對象。

調用一個方法時

test.foo();

在這個例子中,this 將會指向 test 對象。

調用一個建構函式時

new foo();

一個函數在被調用時和關鍵字 new 一起使用,我們稱之為建構函式。此時在函數內,this 指向建立的對象。

顯式設定時

function foo(a, b, c) {}//var bar = {};foo.apply(bar, [1, 2, 3]); // array will expand to the belowfoo.call(bar, 1, 2, 3); // results in a = 1, b = 2, c = 3

當使用 Function.prototype 的 apply 和 call 方法時,this 的值為顯式設定為該方法的第一個參數。
因此,不同於調用一個函數時的規則,上例中 this 指向了 bar。

這裡介紹下 call 和 apply 方法:

 call 方法:

文法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
定義:調用一個對象的一個方法,以另一個對象替換當前對象。

 apply 方法

文法:apply([thisObj[,argArray]])
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
在這裡我們要注意一點,在對象的字面聲明時,this 不能用來指向對象本身。如下:

var obj = {me: this}

這裡,this 不會指向 obj,this 的應用只限於以上五種情形。

總結

儘管上述情形在大多時候是有意義的,但是第二種情形(即調用一個函數時)的 this 實際上是很少有用途的,這被認為是 Javascript 設計上的另一個錯誤。

Foo.method = function() {  function test() {    // this is set to the global object  }  test();}

根據我們上面所述,這裡的 this 將會指向全域對象,而不是 Foo 函數。
為了在 test 中獲得指向 Foo 的途徑,我們需要在 method 內部建立一個局部變數指向 Foo。

Foo.method = function() {  var that = this;  function test() {    // Use that instead of this here  }  test();}

that 只是普通的變數名,但是它經常被用來指向外部的 this。
還有一個比較有意思的地方與函數別名相關,即將一個方法賦值給一個變數時。

var test = someObject.methodTest;test();

上例中,test 將會被當做一個普通函數看待,所以根據第二種情形(即調用一個函數時),其內部的 this 將會指向全域變數,而不是 someObject。
儘管,this 晚綁定初看上去是個不好的決定,但實際上這是原型式繼承工作的基礎。

function Foo() {}Foo.prototype.method = function() {};function Bar() {}Bar.prototype = Foo.prototype;new Bar().method();

此時,當 method 被調用時,它將指向 Bar 的執行個體對象。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.