各位小主好孕锄。
在js中this變量不可謂說不強大已慢,有種變幻莫測的趕腳。深入理解this變量,有助于各位小主更好的理解和編寫面向對象柔滔。
對于this變量最要的是能夠理清this所引用的對象到底是哪一個溢陪,也許很多資料上都有自己的解釋,但有些概念講的偏繁雜睛廊。而我的理解是:首先分析this所在的函數是當做哪個對象的方法調用的形真,則該對象就是this所引用的對象。
示例一
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //彈出 100
這段代碼很容易理解吧超全,相信只要稍微有點基礎的都會明天咆霜,當執(zhí)行 obj.y() 時,函數是作為對象obj的方法調用的嘶朱,因此函數體內的this指向的是obj對象蛾坯,因而會彈出100。 OK疏遏,我們繼續(xù)往下看
示例二
var checkThis = function(){
alert( this.x);
};
var x = 'this is a property of window';
var obj = {};
obj.x = 100;
obj.y = function(){
alert( this.x );
};
obj.y(); //彈出 100
checkThis(); //彈出 'this is a property of window'
咦脉课?奇怪,這里為什么會彈出 'this is a property of window'改览,相信有些人會感到迷惑表示驚訝下翎。其實不難理解,在js的變量作用域里有一條規(guī)則“全局變量都是window對象的屬性”宝当。當執(zhí)行checkThis() 時相當于window.checkThis()视事,因此,此時checkThis函數體內的this關鍵字的指向變成了window對象庆揩,而又因為window對象有一個x屬性('thisis a property of window'),所以會彈出 'thisis a property of window'俐东。
上面的兩個示例都是比較容易理解的,因為只要判斷出當前函數是作為哪個對象的方法調用(被哪個對象調用)的订晌,就可以很容易的判斷出當前this變量的指向虏辫。 那么下面加點料。
this.x 與apply()锈拨、call()
我們知道砌庄,通過call和apply可以重新定義函數的執(zhí)行環(huán)境,即this的指向奕枢,一種十分常見的用法娄昆。
示例三:call()
function changeStyle( type , value ){
this.style[ type ] = value;
}
var one = document.getElementByIdx( 'one' );
changeStyle.call( one , 'fontSize' , '100px' );
changeStyle('fontSize' , '300px'); //出現(xiàn)錯誤,因為此時changeStyle中this引用的是window對象缝彬,而window并無style屬性萌焰。
注意changeStyle.call()中有三個參數,第一個參數用于指定該函數將被哪個對象所調用谷浅。這里指定了one扒俯,也就意味著奶卓,changeStyle函數將被one調用,因此函數體內this指向是one對象撼玄。而第二個和第三個參數對應的是changeStyle函數里的type和value兩個形參夺姑。最總我們看到的效果是Dom元素one的字體變成了20px。
示例四:apply()
function changeStyle( type , value ){
this.style[ type ] = value;
}
var one = document.getElementByIdx( 'one' );
changeStyle.apply( one , ['fontSize' , '100px' ]);
changeStyle('fontSize' , '300px'); //出現(xiàn)錯誤互纯,原因同示例三
apply的用法和call大致相同瑟幕,只有一點區(qū)別,apply只接受兩個參數留潦,第一個參數和call相同只盹,第二個參數必須是一個數組,數組中的元素對應的就是函數的形參兔院。
無意義(詭異)的this用處
示例五
var obj = {
x : 100,
y : function(){
setTimeout(
function(){ alert(this.x); } //這里的this指向的是window對象殖卑,并不是我們期待的 obj,所以會彈出undefined
, 2000);
}
};
obj.y();
想要達到預期效果需要
var obj = {
x : 100,
y : function(){
var that = this;
setTimeout(
function(){ alert(that.x); }
, 2000);
}
};
obj.y(); //彈出100
事件監(jiān)聽函數中的this
var one = document.getElementByIdx( 'one' );
one.onclick = function(){
alert( this.innerHTML ); //this指向的是one元素,這點十分簡單..
};
注意:js中的全局變量都會動態(tài)添加到Window 的實例 window坊萝,作為其屬性孵稽。
this是js的一個關鍵字,隨著函數使用場合不同十偶,this的值會發(fā)生變化菩鲜。但是總有一個原則,那就是this指的是調用函數的那個對象惦积。
1接校、純粹函數調用
function test() {
this.x = 1;
alert(x);
}
test();
這里的this就是全局變量∈ū溃看下面的例子就能很好的理解其實this就是全局對象Global蛛勉。
var x = 1;
function test() {
alert(this.x);
}
test();//1
var x = 1;
function test() {
this.x = 0;
}
test();
alert(x);//0
2、作為方法調用睦柴,那么this就是指這個上級對象诽凌。
function test() {
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); //1
3、作為構造函數調用坦敌。所謂構造函數侣诵,就是生成一個新的對象。這時狱窘,這個this就是指這個對象杜顺。
function test() {
this.x = 1;
}
var o = new test();
alert(o.x);//1
4、apply調用 this指向的是apply中的第一個參數训柴。
var x = 0;
function test() { alert(this.x); }
var o = {};
o.x = 1;
o.m = test;
o.m.apply(); //0
o.m.apply(o);//1
當apply沒有參數時哑舒,表示為全局對象妇拯。所以值為0幻馁。