JS中的this變量的使用介紹
在JavaScript中this變量是一個(gè)令人難以摸清的關(guān)鍵字,this可謂是非常強(qiáng)大,充分了解this的相關(guān)知識(shí)有助于我們?cè)诰帉?xiě)面向?qū)ο蟮腏avaScript程序時(shí)能夠游刃有余。
對(duì)于this變量最要的是能夠理清this所引用的對(duì)象到底是哪一個(gè),也許很多資料上都有自己的解釋?zhuān)行└拍钪v的偏繁雜。而我的理解是:首先分析this所在的函數(shù)是當(dāng)做哪個(gè)對(duì)象的方法調(diào)用的,則該對(duì)象就是this所引用的對(duì)象。
示例一、
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //彈出 100
這段代碼非常容易理解,當(dāng)執(zhí)行 obj.y() 時(shí),函數(shù)是作為對(duì)象obj的方法調(diào)用的,因此函數(shù)體內(nèi)的this指向的是obj對(duì)象,所以會(huì)彈出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'
這里為什么會(huì)彈出 'this is a property of window',可能有些讓人迷惑。在JavaScript的變量作用域里有一條規(guī)則“全局變量都是window對(duì)象的屬性”。當(dāng)執(zhí)行checkThis() 時(shí)相當(dāng)于window.checkThis(),因此,此時(shí)checkThis函數(shù)體內(nèi)的this關(guān)鍵字的指向變成了window對(duì)象,而又因?yàn)閣indow對(duì)象又一個(gè)x屬性('thisis a property of window'),所以會(huì)彈出 'thisis a property of window'。
上面的兩個(gè)示例都是比較容易理解的,因?yàn)橹灰袛喑霎?dāng)前函數(shù)是作為哪個(gè)對(duì)象的方法調(diào)用(被哪個(gè)對(duì)象調(diào)用)的,就可以很容易的判斷出當(dāng)前this變量的指向。
this.x 與apply()、call()
通過(guò)call和apply可以重新定義函數(shù)的執(zhí)行環(huán)境,即this的指向,這對(duì)于一些應(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)錯(cuò)誤,因?yàn)榇藭r(shí)changeStyle中this引用的是window對(duì)象,而window并無(wú)style屬性。
注意changeStyle.call()中有三個(gè)參數(shù),第一個(gè)參數(shù)用于指定該函數(shù)將被哪個(gè)對(duì)象所調(diào)用。這里指定了one,也就意味著,changeStyle函數(shù)將被one調(diào)用,因此函數(shù)體內(nèi)this指向是one對(duì)象。而第二個(gè)和第三個(gè)參數(shù)對(duì)應(yīng)的是changeStyle函數(shù)里的type和value兩個(gè)形參。最總我們看到的效果是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)錯(cuò)誤,原因同示例三
apply的用法和call大致相同,只有一點(diǎn)區(qū)別,apply只接受兩個(gè)參數(shù),第一個(gè)參數(shù)和call相同,第二個(gè)參數(shù)必須是一個(gè)數(shù)組,數(shù)組中的元素對(duì)應(yīng)的就是函數(shù)的形參。
無(wú)意義(詭異)的this用處
示例五:
var obj = {
x : 100,
y : function(){
setTimeout(
function(){ alert(this.x); } //這里的this指向的是window對(duì)象,并不是我們期待的obj,所以會(huì)彈出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)聽(tīng)函數(shù)中的this
var one = document.getElementByIdx( 'one' );
one.onclick = function(){
alert( this.innerHTML ); //this指向的是one元素,這點(diǎn)十分簡(jiǎn)單..
};
注意:js中的全局變量都會(huì)動(dòng)態(tài)添加到Window 的實(shí)例 window,作為其屬性。
this是js的一個(gè)關(guān)鍵字,隨著函數(shù)使用場(chǎng)合不同,this的值會(huì)發(fā)生變化。但是總有一個(gè)原則,那就是this指的是調(diào)用函數(shù)的那個(gè)對(duì)象。
1、純粹函數(shù)調(diào)用。
function test() {
this.x = 1;
alert(x);
}
test();
其實(shí)這里的this就是全局變量??聪旅娴睦泳湍芎芎玫睦斫馄鋵?shí)this就是全局對(duì)象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就是指這個(gè)上級(jí)對(duì)象。
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ù),就是生成一個(gè)新的對(duì)象。這時(shí),這個(gè)this就是指這個(gè)對(duì)象。
function test() {
this.x = 1;
}
var o = new test();
alert(o.x);//1
4、apply調(diào)用
this指向的是apply中的第一個(gè)參數(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沒(méi)有參數(shù)時(shí),表示為全局對(duì)象。所以值為0。
- js中的this關(guān)鍵字詳解
- javascript中onclick(this)用法介紹
- javascript this用法小結(jié)
- 解決vue.js this.$router.push無(wú)效的問(wèn)題
- vue項(xiàng)目中在外部js文件中直接調(diào)用vue實(shí)例的方法比如說(shuō)this
- javascript中this的四種用法
- js報(bào)錯(cuò) Object doesn''t support this property or method的原因分析
- 關(guān)于js里的this關(guān)鍵字的理解
- JavaScript?中的?this?綁定規(guī)則詳解
相關(guān)文章
基于JavaScript實(shí)現(xiàn)繼承機(jī)制之構(gòu)造函數(shù)方法對(duì)象冒充的使用詳解
我們知道JavaScript是面向?qū)ο蟮哪_本語(yǔ)言,那么既然是面向?qū)ο?,繼承一定是必不可少的了。JavaScript的核心是ECMAScript,JavaScript繼承機(jī)制的實(shí)現(xiàn)其實(shí)就是ECMAScript繼承機(jī)制的實(shí)現(xiàn)2013-05-05對(duì)JavaScript的全文搜索實(shí)現(xiàn)相關(guān)度評(píng)分的功能的方法
這篇文章主要介紹了對(duì)JavaScript的全文搜索實(shí)現(xiàn)相關(guān)度評(píng)分的功能的方法,采用了一個(gè)名為Okapi BM25的算法,文中亦有介紹,需要的朋友可以參考下2015-06-06關(guān)于可運(yùn)行代碼無(wú)法正常執(zhí)行的使用說(shuō)明
腳本之家網(wǎng)站為了方便大家快速的查看效果,只要大家運(yùn)行一下代碼即可能看到效果。2010-05-05JavaScript入門(mén)初體驗(yàn)書(shū)寫(xiě)方式
學(xué)了這么久,你真的了解javascript嗎?很多不知道的小白總是把它和java聯(lián)系在一起,在這里阿牛很負(fù)責(zé)任的告訴你們,兩者沒(méi)有任何關(guān)系,今天就來(lái)帶你們一起揭開(kāi)javascript的神秘面紗2022-03-03老生常談 關(guān)于JavaScript的類(lèi)的繼承
下面小編就為大家?guī)?lái)一篇老生常談 關(guān)于JavaScript的類(lèi)的繼承。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06深入理解ECMAScript的幾個(gè)關(guān)鍵語(yǔ)句
下面小編就為大家?guī)?lái)一篇深入理解ECMAScript的幾個(gè)關(guān)鍵語(yǔ)句。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06JavaScript CSS修改學(xué)習(xí)第五章 給“上傳”添加樣式
在所有的表單項(xiàng)里面,文件上傳部分是最難添加樣式的。IE支持一些(不是很多)樣式屬性,Mozilla很少,其他瀏覽器幾乎沒(méi)有?!盀g覽”按鈕在CSS操作里面也很難訪問(wèn)。2010-02-02