在javascript中關(guān)鍵字this是一個(gè)很難掌握的概念。它在不同的情況下指代不同的對象。下面就來看看,在JavaScript中各種this的使用方法有什么不同之處?
1、在HTML元素事件屬性中inline方式使用this關(guān)鍵字:
<div onclick="method(this)">element</div>
這里的this代表觸發(fā)onclick時(shí)間的Dom對象。
2、在事件處理函數(shù)中使用this關(guān)鍵字:
<div id="elmtDiv">element</div>
<script language="javascript">
var div = document.getElementById('elmtDiv');
div.onclick = function()
{
// 在此使用this
};
</script>
這里this指代的對象和上面一樣。
3、函數(shù)中的this
函數(shù)中的this代表調(diào)用函數(shù)的對象。
function print(message)
{
this.alert(message);
}
print("this is window");
例如上面這個(gè)函數(shù)print的定義也可以寫成。window.print = function(){}.調(diào)用print(),實(shí)際上是調(diào)用window對象上的方法print。所以print中的this代表window對象。還有類似的情況是在構(gòu)造函數(shù)中定義的方法:
function MyClass(name)
{
this.name = name;
this.toString = function(){
return this.name;
}
}
var my = new MyClass('myclass');
alert(my.toString());
This指向的是調(diào)用此方法的對象my。
4、在類的構(gòu)造函數(shù)中使用this
代碼
function JSClass()
{
var myName = 'jsclass';
this.m_Name = 'JSClass';
}
JSClass.prototype.ToString = function()
{
alert(myName + ', ' + this.m_Name);
};
var jc = new JSClass();
jc.ToString();
這是JavaScript構(gòu)造函數(shù)中對this的使用,這個(gè)和其它的OO語言中的情況非常的相識(shí)。但是這里要求成員屬性和方法必須使用this關(guān)鍵字來引用,運(yùn)行上面的程序會(huì)被告知myName未定義。有關(guān)構(gòu)造函數(shù)的相關(guān)內(nèi)容:Javascript(js)使用function定義構(gòu)造函數(shù)有詳細(xì)的介紹。
5、為腳本引擎內(nèi)部對象添加原形方法中的this關(guān)鍵字
Function.prototype.GetName = function()
{
var fnName = this.toString();
fnName = fnName.substr(0, fnName.indexOf('('));
fnName = fnName.replace(/^function/, '');
return fnName.replace(/(^s+)|(s+$)/g, '');
}
function foo(){}
alert(foo.GetName());
這里的this指代的是被添加原形的類的實(shí)例。
6、函數(shù)調(diào)用中的this
在將函數(shù)作為一個(gè)對象的方法調(diào)用時(shí),如:
function print()
{
alert(this.toString());
}
print.apply('this is first argument');
print.call('this is first argument');
在Function.apply和Function.call中的第一個(gè)參數(shù)就是函數(shù)中this的對象。