學(xué)習(xí)this時(shí)衔蹲,我們主要的問題是:如何判斷當(dāng)前的this指向某個(gè)對(duì)象莫其?
“哪個(gè)對(duì)象調(diào)用了這個(gè)函數(shù)倍啥,則這個(gè)函數(shù)中的this就指向哪個(gè)對(duì)象注服【碌耍”
公式
如果你的調(diào)用格式是:
obj.fun();
則函數(shù)fun()中的this就會(huì)指向obj。
示例
1.全局函數(shù)
//定義函數(shù)
function f(){
console.info( this );
}
//調(diào)用函數(shù)
f(); //這里的this就是window
原因: 這里的 f() 與window.f()是等價(jià)的,相當(dāng)于是window對(duì)象調(diào)用了f函數(shù)溶弟,所以f()函數(shù)中的this就會(huì)指向的window女淑。
2.對(duì)象的方法
如果我們希望給所有的數(shù)組對(duì)象都加一個(gè)方法,我們?cè)跇?gòu)造器Array的prototype屬性中進(jìn)行設(shè)置:
Array.prototype.fun = function(){
console.info( this.length);
}
如何確定上面的this指向哪個(gè)對(duì)象辜御?注意現(xiàn)在確定不了鸭你,此時(shí)只是定義一個(gè)函數(shù),并沒有調(diào)用.
下面看看調(diào)用形式:
var arr = new Array();
arr.fun(); //這里才是調(diào)用方法
這里有兩個(gè)問題
(1)為什么 arr.fun();可以調(diào)用我抠? 這個(gè)問題涉及原型鏈相關(guān)知識(shí)苇本。后面再說。
(2)此時(shí)fun中的this是誰菜拓? “ 誰調(diào)用就指向誰瓣窄。 ”這個(gè)答案就清楚了:這時(shí)this就是arr。所以this.length就是arr.length;
3.事件響應(yīng)
var btn = document.getElementById("btn");
btn.onclick = function(){
console.info( this );
}
上面只是添加了事件監(jiān)聽纳鼎,這段函數(shù)只有在按鈕被點(diǎn)擊時(shí)俺夕,才會(huì)執(zhí)行,它執(zhí)行時(shí):this就是btn贱鄙。
還是符合我們的公式的:誰調(diào)用就指向誰劝贸。
4.兩個(gè)復(fù)雜一點(diǎn)的例子
1.
var x = 1;
var foo = {
x : 2,
getX:function(){
console.info( this.x);
}
}
foo.getX();// (1)
var f1 = foo.getX; // (3)
f1();// (2)
setTimeout(foo.getX,1000); //(4)
(1)處。會(huì)得到2 逗宁。因?yàn)槭峭ㄟ^foo.getX()的方式訪問的映九,“誰調(diào)用就指向誰”。所以this就是 foo對(duì)象瞎颗,訪問就是foo的屬性x件甥。
(2)處。會(huì)得到1哼拔。 因?yàn)閒1()相當(dāng)于window.f1()引有, 所以this就是window對(duì)象譬正,這里訪問的就是全局變量x。
(4)處曾我。會(huì)得到1粉怕。為什么斋荞?還是那句話“誰調(diào)用就指向誰”。setTimeout()會(huì)在1000ms秒去執(zhí)行foo.getX所指向的那個(gè)函數(shù)體:function(){console.info(this.x); }蜈彼,問題的關(guān)鍵是:是哪個(gè)對(duì)象在調(diào)用這個(gè)函數(shù)體? 此時(shí)可以認(rèn)為這個(gè)函數(shù)不屬于任何對(duì)象还绘,但這一類函數(shù)就是屬于window對(duì)象的,所以其中的this就是window,所以會(huì)得到1昔案。
理解(3): =號(hào)的右邊,是對(duì)象的屬性捞稿,這里定義一個(gè)變量f1來用保存foo的getX的值,這個(gè)值是一個(gè)函數(shù)。
2.
var x = "a",y="b";
var foo = {
x:2,
y:3,
getXY:function(){
(function(){
console.info("x:"+this.x); // "a"
console.info("y:"+this.y); // "b"
})(); //此處是立即執(zhí)行函數(shù)表達(dá)式
}
}
foo.getXY();
理解: 這里的this不是getXY這個(gè)函數(shù)的,而是寫在立即執(zhí)行函數(shù)表達(dá)式的穴翩。所以foo.getXY()時(shí)歉嗓,調(diào)用這個(gè)立即執(zhí)行函數(shù)表達(dá)式的不是 foo這個(gè)對(duì)象,而應(yīng)該是window對(duì)象。所以結(jié)果是 "a " , " b"伦糯。
小結(jié)
誰調(diào)用這個(gè)function剂癌,這個(gè)function中的this就會(huì)指向誰寡具。