this是Javascript語(yǔ)言的一個(gè)關(guān)鍵字实束。正確掌握了 JavaScript 中的 this 關(guān)鍵字,才算邁入了 JavaScript 這門(mén)語(yǔ)言的門(mén)檻逊彭。
this 不是變量,不是屬性构订,不能為其賦值侮叮,它始終指向調(diào)用它的對(duì)象。
只要記住最重要的一條即可“它始終指向調(diào)用它的對(duì)象” 悼瘾,所以找到調(diào)用this的對(duì)象囊榜,就知道this到底指向誰(shuí)了
它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象亥宿,只能在函數(shù)內(nèi)部使用卸勺。
下面分四種情況,詳細(xì)討論this的用法烫扼。
情況一:純粹的函數(shù)調(diào)用
這是函數(shù)的最通常用法曙求,屬于全局性調(diào)用,因此this就代表全局對(duì)象Global。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
var test = function(){
alert(this === window);
}
test(); //true
純粹的函數(shù)調(diào)用也有感覺(jué)上似乎復(fù)雜的:
var test = function(){
var innerTest = function(){
alert(this === test);
}
innerTest();
}
test();
你不會(huì)認(rèn)為彈出"true"吧悟狱,不是按照上面的理論'innerTest'是被'test'調(diào)用的静浴,然后'this'就指向'test'嗎?
額挤渐,錯(cuò)就錯(cuò)在是誰(shuí)調(diào)用的'innerTest', 其實(shí)這種函數(shù)都是'window'對(duì)象調(diào)用的苹享,即使你嵌套一千層,調(diào)用各個(gè)函數(shù)的都是'window'對(duì)象,奉上下面這段代碼為證
var test = function(){
var innerTest = function(){
alert(this === window); //true
var innerTest1 = function(){
alert(this === window); //true
}
innerTest1();
}
innerTest();
}
test();
情況二:作為對(duì)象方法的調(diào)用
函數(shù)還可以作為某個(gè)對(duì)象的方法調(diào)用浴麻,這時(shí)this就指這個(gè)上級(jí)對(duì)象得问。
function test(){
alert(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test; //作為對(duì)象的方法調(diào)用
obj.m(); //1
下面的你不會(huì)認(rèn)為結(jié)果為"false"吧!软免,'test1'和'test' 兩個(gè)都指向一個(gè)對(duì)象宫纬,所以是true。關(guān)鍵記住”this 始終指向調(diào)用它的對(duì)象“或杠。
var test ={
'a':1,
'b':function(){
alert(this === test)
}
}
var test1 = test;
test1.b(); //true
下面是 "true" 還是 "false" 呢哪怔?
var test ={
'a':1,
'b':{
'b1':function(){
alert(this === test);
}
}
}
test.b.b1();
按照上面的理論,這時(shí) "this" 不再直接被 'test' 調(diào)用了向抢,而是被 'test.b' 調(diào)用, 奉上下面一段代碼為證:
var test ={
'a':1,
'b':{
'b1':function(){
alert(this === test.b);
}
}
}
test.b.b1(); //true
情況三 作為構(gòu)造函數(shù)調(diào)用
所謂構(gòu)造函數(shù)认境,就是通過(guò)這個(gè)函數(shù)生成一個(gè)新對(duì)象(object)。這時(shí)挟鸠,this就指這個(gè)新對(duì)象叉信。
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
下面構(gòu)造函數(shù)”new test()“創(chuàng)建了一個(gè)新的空對(duì)象,然后再由這個(gè)對(duì)象指向函數(shù)"test"中的代碼艘希,因此此時(shí)this不在是window對(duì)象硼身,而是該構(gòu)造函數(shù)創(chuàng)建的新對(duì)象
var test = function(){
alert(this === window);
}
new test(); //false
情況四 apply調(diào)用
apply()是函數(shù)對(duì)象的一個(gè)方法,它的作用是改變函數(shù)的調(diào)用對(duì)象覆享,它的第一個(gè)參數(shù)就表示改變后的調(diào)用這個(gè)函數(shù)的對(duì)象佳遂。因此,this指的就是這第一個(gè)參數(shù)撒顿。
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
apply()的參數(shù)為空時(shí)丑罪,默認(rèn)調(diào)用全局對(duì)象。因此凤壁,這時(shí)的運(yùn)行結(jié)果為0吩屹,證明this指的是全局對(duì)象。
如果把最后一行代碼修改為: o.m.apply(o); //1
運(yùn)行結(jié)果就變成了1拧抖,證明了這時(shí)this代表的是對(duì)象o煤搜。
再來(lái)一段:
var test = function(){
alert(this === window);
}
var test1 = {
}
test.apply(test1); //false
apply作用就是”調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象“ 所以了'window' 對(duì)象已經(jīng)被替代為'test1'唧席,自然為'false'了,奉上如下代碼以為證明:
var test = function(){
alert(this === test1);
}
var test1 = {
}
test.apply(test1); //true