this的指向在很多時候會把人弄的很懵,但是筆者可以肯定的說,你看完這篇文章絕對能弄懂this的指向。
在不同的場景this分别指向誰:
一:純粹的函數調用
var x = 1;
function test() {
console.log(this.x) //指向window,輸出1
}
test() //這個其實是window.test()的簡寫
此時是window調用的test方法,是以函數體裡的this就指向了window。
二:作為對象的方法調用
function test () {
console.log(this.x) //指向obj,輸出2
}
var obj = {};
obj.x = 2;
obj.m = test;
obj.m();
此時的test函數被用作了obj對象的方法來調用的,是以test裡的this就指向了obj。
三:作為構造函數調用
var x = 4; //定義全局變量,為了用來測試
function Test () {
this.x = 11; //this指向newObj
}
var newObj = new Test();
console.log(newObj.x) //輸出11
console.log(x) //輸出結果為4,表明全局變量沒有被this.x影響
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply(); //0
test.apply(obj); //1
new test();
test.apply(); //0
總結:
- 通常在函數中的this指向的是調用函數的哪個對象(誰調用指向誰)
- 事件函數中的this通常指向的是綁定事件的事件源元素
- 構造函數中的this,(使用new調用構造函數建立對象),通常指向的是new所建立出來的對象本身
- 全局範圍的this通常指向的是全局對象(浏覽器中是window)