Javascript this 的一些學(xué)習(xí)總結(jié)
2024-05-06 14:21:17
供稿:網(wǎng)友
1.1.1 摘要
相信有C++、C#或Java等編程經(jīng)驗(yàn)的各位,對(duì)于this關(guān)鍵字再熟悉不過(guò)了。由于Javascript是一種面向?qū)ο蟮木幊陶Z(yǔ)言,它和C++、C#或Java一樣都包含this關(guān)鍵字,接下來(lái)我們將向大家介紹Javascript中的this關(guān)鍵字。
本文目錄
•全局代碼中的this
•函數(shù)中的this
•引用類(lèi)型
•函數(shù)調(diào)用以及非引用類(lèi)型
•引用類(lèi)型以及this的null值
•函數(shù)作為構(gòu)造器被調(diào)用時(shí)this的值
•手動(dòng)設(shè)置函數(shù)調(diào)用時(shí)this的值
1.1.2 正文
由于許多面向?qū)ο蟮木幊陶Z(yǔ)言都包含this關(guān)鍵字,我們會(huì)很自然地把this和面向?qū)ο蟮木幊谭绞铰?lián)系在一起,this通常指向利用構(gòu)造器新創(chuàng)建出來(lái)的對(duì)象。而在ECMAScript中,this不僅僅只用來(lái)表示創(chuàng)建出來(lái)的對(duì)象,也是執(zhí)行上下文的一個(gè)屬性:
代碼如下:
activeExecutionContext = {
// Variable object.
VO: {...},
this: thisValue
};
全局代碼中的this
代碼如下:
// Global scope
// The implicit property of
// the global object
foo1 = "abc";
alert(foo1); // abc
// The explicit property of
// the global object
this.foo2 = "def";
alert(foo2); // def
// The implicit property of
// the global object
var foo3 = "ijk";
alert(foo3); // ijk
前面我們通過(guò)顯式和隱式定義了全局屬性foo1、foo2和foo3,由于this在全局上下文中,所以它的值是全局對(duì)象本身(在瀏覽器中是window object);接下來(lái)我們將介紹函數(shù)中的this。
函數(shù)中的this
當(dāng)this在函數(shù)代碼中,情況就復(fù)雜多了,并且會(huì)引發(fā)很多的問(wèn)題。
函數(shù)代碼中this值的第一個(gè)特性(同時(shí)也是最主要的特性)就是:它并非靜態(tài)的綁定在函數(shù)上。
正如此前提到的,this的值是在進(jìn)入執(zhí)行上下文(Excution context)的階段確定的,并且在函數(shù)代碼中的話,其值每次都不盡相同。
然而,一旦進(jìn)入執(zhí)行代碼階段,其值就不能改變了。如果要想給this賦一個(gè)新的值是不可能的,因?yàn)樵谀菚r(shí)this根本就不是變量了。
接下來(lái),我們通過(guò)具體的例子說(shuō)明函數(shù)中的this。
首先我們定義兩個(gè)對(duì)象foo和person,foo包含一個(gè)屬性name,而person包含屬性name和方法say(),具體的定義如下:
代碼如下:
// Defines foo object.
var foo = {
name: "Foo"
};
// Defines person object.
var person = {
name: "JK_Rush",
say: function() {
alert(this === person);
alert("My name is " + this.name);
}
};
person.say(); // My name is JK_Rush
// foo and person object refer to
// the same function say
foo.say = person.say;
foo.say(); // My name is Foo.
通過(guò)上面的代碼,我們發(fā)現(xiàn)調(diào)用person的say()方法時(shí),this指向person對(duì)象,當(dāng)通過(guò)賦值方式使得foo的say()方法指向peson中的say()方法時(shí)。我們調(diào)用foo的say()方法,發(fā)現(xiàn)this不是指向person對(duì)象,而不是指向foo對(duì)象,這究竟是什么原因呢?