JS中的this變量的使用介紹
更新時間:2013年10月21日 16:27:49 作者:
在JavaScript中this變量是一個令人難以摸清的關(guān)鍵字,this可謂是非常強(qiáng)大,在本文將為大家詳細(xì)介紹下JavaScript中this的使用,感興趣的朋友可以參考下
JavaScript中this的使用
在JavaScript中this變量是一個令人難以摸清的關(guān)鍵字,this可謂是非常強(qiáng)大,充分了解this的相關(guān)知識有助于我們在編寫面向?qū)ο蟮腏avaScript程序時能夠游刃有余。
對于this變量最要的是能夠理清this所引用的對象到底是哪一個,也許很多資料上都有自己的解釋,但有些概念講的偏繁雜。而我的理解是:首先分析this所在的函數(shù)是當(dāng)做哪個對象的方法調(diào)用的,則該對象就是this所引用的對象。
示例一、
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //彈出 100
這段代碼非常容易理解,當(dāng)執(zhí)行 obj.y() 時,函數(shù)是作為對象obj的方法調(diào)用的,因此函數(shù)體內(nèi)的this指向的是obj對象,所以會彈出100。
示例二、
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',可能有些讓人迷惑。在JavaScript的變量作用域里有一條規(guī)則“全局變量都是window對象的屬性”。當(dāng)執(zhí)行checkThis() 時相當(dāng)于window.checkThis(),因此,此時checkThis函數(shù)體內(nèi)的this關(guān)鍵字的指向變成了window對象,而又因為window對象又一個x屬性('thisis a property of window'),所以會彈出 'thisis a property of window'。
上面的兩個示例都是比較容易理解的,因為只要判斷出當(dāng)前函數(shù)是作為哪個對象的方法調(diào)用(被哪個對象調(diào)用)的,就可以很容易的判斷出當(dāng)前this變量的指向。
this.x 與apply()、call()
通過call和apply可以重新定義函數(shù)的執(zhí)行環(huán)境,即this的指向,這對于一些應(yīng)用當(dāng)中是十分常用的。
示例三: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()中有三個參數(shù),第一個參數(shù)用于指定該函數(shù)將被哪個對象所調(diào)用。這里指定了one,也就意味著,changeStyle函數(shù)將被one調(diào)用,因此函數(shù)體內(nèi)this指向是one對象。而第二個和第三個參數(shù)對應(yīng)的是changeStyle函數(shù)里的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只接受兩個參數(shù),第一個參數(shù)和call相同,第二個參數(shù)必須是一個數(shù)組,數(shù)組中的元素對應(yīng)的就是函數(shù)的形參。
無意義(詭異)的this用處
示例五:
var obj = {
x : 100,
y : function(){
setTimeout(
function(){ alert(this.x); } //這里的this指向的是window對象,并不是我們期待的obj,所以會彈出undefined
, 2000);
}
};
obj.y();
如何達(dá)到預(yù)期的效果
var obj = {
x : 100,
y : function(){
var that = this;
setTimeout(
function(){ alert(that.x); }
, 2000);
}
};
obj.y(); //彈出100
事件監(jiān)聽函數(shù)中的this
var one = document.getElementByIdx( 'one' );
one.onclick = function(){
alert( this.innerHTML ); //this指向的是one元素,這點十分簡單..
};
注意:js中的全局變量都會動態(tài)添加到Window 的實例 window,作為其屬性。
this是js的一個關(guān)鍵字,隨著函數(shù)使用場合不同,this的值會發(fā)生變化。但是總有一個原則,那就是this指的是調(diào)用函數(shù)的那個對象。
1、純粹函數(shù)調(diào)用。
function test() {
this.x = 1;
alert(x);
}
test();
其實這里的this就是全局變量??聪旅娴睦泳湍芎芎玫睦斫馄鋵峵his就是全局對象Global。
var x = 1;
function test() {
alert(this.x);
}
test();//1
var x = 1;
function test() {
this.x = 0;
}
test();
alert(x);//0
2、作為方法調(diào)用,那么this就是指這個上級對象。
function test() {
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); //1
3、作為構(gòu)造函數(shù)調(diào)用。所謂構(gòu)造函數(shù),就是生成一個新的對象。這時,這個this就是指這個對象。
function test() {
this.x = 1;
}
var o = new test();
alert(o.x);//1
4、apply調(diào)用
this指向的是apply中的第一個參數(shù)。
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
當(dāng)apply沒有參數(shù)時,表示為全局對象。所以值為0。
在JavaScript中this變量是一個令人難以摸清的關(guān)鍵字,this可謂是非常強(qiáng)大,充分了解this的相關(guān)知識有助于我們在編寫面向?qū)ο蟮腏avaScript程序時能夠游刃有余。
對于this變量最要的是能夠理清this所引用的對象到底是哪一個,也許很多資料上都有自己的解釋,但有些概念講的偏繁雜。而我的理解是:首先分析this所在的函數(shù)是當(dāng)做哪個對象的方法調(diào)用的,則該對象就是this所引用的對象。
示例一、
復(fù)制代碼 代碼如下:
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //彈出 100
這段代碼非常容易理解,當(dāng)執(zhí)行 obj.y() 時,函數(shù)是作為對象obj的方法調(diào)用的,因此函數(shù)體內(nèi)的this指向的是obj對象,所以會彈出100。
示例二、
復(fù)制代碼 代碼如下:
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',可能有些讓人迷惑。在JavaScript的變量作用域里有一條規(guī)則“全局變量都是window對象的屬性”。當(dāng)執(zhí)行checkThis() 時相當(dāng)于window.checkThis(),因此,此時checkThis函數(shù)體內(nèi)的this關(guān)鍵字的指向變成了window對象,而又因為window對象又一個x屬性('thisis a property of window'),所以會彈出 'thisis a property of window'。
上面的兩個示例都是比較容易理解的,因為只要判斷出當(dāng)前函數(shù)是作為哪個對象的方法調(diào)用(被哪個對象調(diào)用)的,就可以很容易的判斷出當(dāng)前this變量的指向。
this.x 與apply()、call()
通過call和apply可以重新定義函數(shù)的執(zhí)行環(huán)境,即this的指向,這對于一些應(yīng)用當(dāng)中是十分常用的。
示例三:call()
復(fù)制代碼 代碼如下:
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()中有三個參數(shù),第一個參數(shù)用于指定該函數(shù)將被哪個對象所調(diào)用。這里指定了one,也就意味著,changeStyle函數(shù)將被one調(diào)用,因此函數(shù)體內(nèi)this指向是one對象。而第二個和第三個參數(shù)對應(yīng)的是changeStyle函數(shù)里的type和value兩個形參。最總我們看到的效果是Dom元素one的字體變成了20px。
示例四:apply()
復(fù)制代碼 代碼如下:
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只接受兩個參數(shù),第一個參數(shù)和call相同,第二個參數(shù)必須是一個數(shù)組,數(shù)組中的元素對應(yīng)的就是函數(shù)的形參。
無意義(詭異)的this用處
示例五:
復(fù)制代碼 代碼如下:
var obj = {
x : 100,
y : function(){
setTimeout(
function(){ alert(this.x); } //這里的this指向的是window對象,并不是我們期待的obj,所以會彈出undefined
, 2000);
}
};
obj.y();
如何達(dá)到預(yù)期的效果
復(fù)制代碼 代碼如下:
var obj = {
x : 100,
y : function(){
var that = this;
setTimeout(
function(){ alert(that.x); }
, 2000);
}
};
obj.y(); //彈出100
事件監(jiān)聽函數(shù)中的this
復(fù)制代碼 代碼如下:
var one = document.getElementByIdx( 'one' );
one.onclick = function(){
alert( this.innerHTML ); //this指向的是one元素,這點十分簡單..
};
注意:js中的全局變量都會動態(tài)添加到Window 的實例 window,作為其屬性。
this是js的一個關(guān)鍵字,隨著函數(shù)使用場合不同,this的值會發(fā)生變化。但是總有一個原則,那就是this指的是調(diào)用函數(shù)的那個對象。
1、純粹函數(shù)調(diào)用。
復(fù)制代碼 代碼如下:
function test() {
this.x = 1;
alert(x);
}
test();
其實這里的this就是全局變量??聪旅娴睦泳湍芎芎玫睦斫馄鋵峵his就是全局對象Global。
復(fù)制代碼 代碼如下:
var x = 1;
function test() {
alert(this.x);
}
test();//1
var x = 1;
function test() {
this.x = 0;
}
test();
alert(x);//0
2、作為方法調(diào)用,那么this就是指這個上級對象。
復(fù)制代碼 代碼如下:
function test() {
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); //1
3、作為構(gòu)造函數(shù)調(diào)用。所謂構(gòu)造函數(shù),就是生成一個新的對象。這時,這個this就是指這個對象。
復(fù)制代碼 代碼如下:
function test() {
this.x = 1;
}
var o = new test();
alert(o.x);//1
4、apply調(diào)用
this指向的是apply中的第一個參數(shù)。
復(fù)制代碼 代碼如下:
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
當(dāng)apply沒有參數(shù)時,表示為全局對象。所以值為0。
相關(guān)文章
Javascript學(xué)習(xí)筆記7 原型鏈的原理
說到prototype,就不得不先說下new的過程。2010-01-01引用外部腳本時script標(biāo)簽關(guān)閉的寫法
在引用外部腳本時,script標(biāo)簽的關(guān)閉寫法,很多朋友對它保持健忘態(tài)度,下面為大家介紹下其正確的寫法2014-01-01JavaScript DOM 學(xué)習(xí)第七章 表單的擴(kuò)展
這一章我會處理一個簡單的W3C DOM腳本。他會幫助我們從一個新的角度來看待交互設(shè)計。2010-02-02JavaScript中反正弦函數(shù)Math.asin()的使用簡介
這篇文章主要介紹了JavaScript中反正弦函數(shù)Math.asin()的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-06-06深入理解JavaScript系列(42):設(shè)計模式之原型模式詳解
這篇文章主要介紹了深入理解JavaScript系列(42):設(shè)計模式之原型模式詳解,原型模式(prototype)是指用原型實例指向創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象,需要的朋友可以參考下2015-03-03JavaScript 頁面坐標(biāo)相關(guān)知識整理
對于頁面的一些坐標(biāo)與位置分析,一般需要控制層的位置的朋友有幫助。需要的朋友可以參考下。2010-01-01