亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2014年06月24日 09:48:07   投稿:hebedich  
與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機制。this 在五種情況下的值是各有不同的。

全局作用域下

this;
當在全局作用域中使用 this,它指向全局對象。
這里詳細介紹下全局對象:

全局對象(Global object) 是在進入任何執(zhí)行上下文之前就已經(jīng)創(chuàng)建了的對象;
這個對象只存在一份,它的屬性在程序中任何地方都可以訪問,全局對象的生命周期終止于程序退出那一刻。
全局對象初始創(chuàng)建階段將 Math、String、Date、parseInt 作為自身屬性,等屬性初始化,同樣也可以有額外創(chuàng)建的其它對象作為屬性(其可以指向到全局對象自身)。例如,在 DOM 中,全局對象的 window 屬性就可以引用全局對象自身。
所以在 console 內(nèi)輸入 window 和 this.window 是一樣的。

調(diào)用一個函數(shù)時

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

調(diào)用一個方法時

test.foo();

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

調(diào)用一個構造函數(shù)時

new foo();

一個函數(shù)在被調(diào)用時和關鍵字 new 一起使用,我們稱之為構造函數(shù)。此時在函數(shù)內(nèi),this 指向新建的對象。

顯式設置時

function foo(a, b, c) {}//

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

當使用 Function.prototype 的 apply 和 call 方法時,this 的值為顯式設置為該方法的第一個參數(shù)。
因此,不同于調(diào)用一個函數(shù)時的規(guī)則,上例中 this 指向了 bar。

這里介紹下 call 和 apply 方法:

 call 方法:

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

 apply 方法

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

var obj = {me: this}

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

總結

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

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

根據(jù)我們上面所述,這里的 this 將會指向全局對象,而不是 Foo 函數(shù)。
為了在 test 中獲得指向 Foo 的途徑,我們需要在 method 內(nèi)部創(chuàng)建一個局部變量指向 Foo。

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

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

var test = someObject.methodTest;
test();

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

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

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

new Bar().method();

此時,當 method 被調(diào)用時,它將指向 Bar 的實例對象。

相關文章

最新評論