this總是指向函數的直接調用者(而非間接調用者)忠寻;如果有new關鍵字,this指向new出來的那個對象存和;在事件中奕剃,this指向觸發(fā)這個事件的對象,特殊的是捐腿,IE中的attachEvent中的this總是指向全局對象Window纵朋;
通俗的講,因為this只存在于函數中茄袖,而函數是需要被調用的操软,然后this是誰(對象)調用函數就指向誰(對象)。下面我們看看不同情況下的this指向情況宪祥。
1)單純的函數調用
<script>
function test(){
this.x = 1;
alert(this.x)//結果為:1
};
test();//這里window調用了test函數聂薪, window.x即this.x
alert(this.x) ;//結果為:1
alert('x' in window);//結果為:true
</script>
``
2)函數作為對象的方法調用
var test = {
a:1,
b:function(){
alert(this.a);
}
};
test.b();//結果為:1 test調用了函數b,this指向test
alert(this.a);//結果為:undefined window調用了alert函數蝗羊,this指向 window而window里并沒有a這個屬性藏澳。
注:在非嚴格模式下,this沒有正確指向耀找,則指向window對象笆载,在嚴格模式下,沒有正確指向涯呻,為 undefined凉驻。默認就是非嚴格模式。
3)作為構造函數調用
<script>
function test(){
this.a = 1;
};
var test2 = new test();
alert(test2.a);//結果為:1
</script>
這里this指向的是構造的新對象复罐,也就是 test2涝登,所以test2也有了屬性a并等于1。
4)apply()效诅、call() 調用
<script>
var a = 0,
test1 = {
a:1,
fun:function(){
alert(this.a);
}
},
test2 = {
a:2
};
test1.fun();//結果為:1
test1.fun.call(test2);//結果為:2
test1.fun.call();//結果為:0
</script>
這里的三次調用胀滚,this分別指向test1、test2和window乱投。第一種前面已經提到了咽笼,第二種是通過call或者apply方法使fun中原本指向test1的this變成了指向test2(即call、apply方法的第一個參數)戚炫。第三種情況屬于第一個參數為空(好像為undefined時也會指向window)時剑刑,會默認指向window,..call() =》 ..call(window)。