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