淺談JavaScript中的this指針和引用知識(shí)
this是javascript的一個(gè)關(guān)鍵字,隨著函數(shù)使用場(chǎng)合不同,this的值會(huì)發(fā)生變化。但是總有一個(gè)原則,那就是this指的是調(diào)用函數(shù)的那個(gè)對(duì)象。
this指針在傳統(tǒng)OO語(yǔ)言中,是在類中聲明的,表示對(duì)象本身.在JavaScript中,this表示當(dāng)前上下文,即調(diào)用者的引用
********this永遠(yuǎn)指向的是(函數(shù)對(duì)象)的所有者
this和全局對(duì)象:
var a = 1; function foo(){ var b = 2; console.log(this.a+b);//3 } foo(); //foo函數(shù)所有者是window,全局函數(shù)中this指代的是window對(duì)象(********除非使用new,call,apply方法來改變this的指代關(guān)系)
this和對(duì)象:
var person = { name:'Theo Wong', gender:'male', getName:function(){ console.log(this.name);//getName函數(shù)所有者是person對(duì)象 } }; person.getName();
嵌套函數(shù)中的this
var myObject = { func1:function() { console.log(this); //myObject var func2=function() { console.log(this); //window var func3=function() { console.log(this); //window }(); }(); } }; myObject.func1(); //在嵌套函數(shù)中,由于嵌套函數(shù)的執(zhí)行上下文是window,所以this指代的是window對(duì)象,其實(shí)這是ECMA-262-3的一個(gè)bug,在最新的ECMA-262-5中已經(jīng)修復(fù)
事件處理中的this:
var showValue = function(){ alert(this.value); };
1.<input id="test" type="text" />
通過dom.onclick綁定事件,document.getElementById('test').onclick = showValue;
此時(shí)showValue是作為dom的onclick方法被調(diào)用的,所以它的this應(yīng)該指代的是dom對(duì)象,而不再是window對(duì)象
2.寫在html標(biāo)簽內(nèi),<input id="test" type="text" onclick="showValue();" />
當(dāng)點(diǎn)擊dom時(shí),我們獲取不到正確的this,此時(shí)的this指代的是window對(duì)象,因?yàn)閣indow對(duì)象中沒有定義value的值,所以獲取不到this.value
***此時(shí)的不是將showValue函數(shù)賦值給dom對(duì)象的onclick,而是引用,此時(shí)function()函數(shù)所有者是window
document.getElementById('test').onclick = function(){ showValue(); }
通過addEventListener/attachEvent綁定事件監(jiān)聽
<input type="text" id="test" /> <script type="text/javascript"> var dom = document.getElementById('test'); id = 'window'; function test(){ alert(this.id); } dom.addEventListener?dom.addEventListener('click',test,false):dom.attachEvent('onclick',test); //addEventListener test //attachEvent window </script> //這種綁定事件監(jiān)聽的方式,attachEvent this是window對(duì)象,而addEventListener則是dom對(duì)象的
this和構(gòu)造:
function obj(name,age){ this.name = name; this.age = age; this.fun = function(){ alert(this.name); }; } var obj = new obj('xht',18);//this就指這個(gè)新對(duì)象,new 改變this的指代關(guān)系 obj.fun();//xht
this和call
//定義一個(gè)人,名字為jack var jack = { name : "jack", age : 26 } //定義另一個(gè)人,名字為abruzzi var abruzzi = { name : "abruzzi", age : 26 } //定義一個(gè)全局的函數(shù)對(duì)象 function alertName(){ return this.name; } //設(shè)置alertName的上下文為jack, 此時(shí)的this為jack alert(alertName.call(jack)); //設(shè)置alertName的上下文為abruzzi,此時(shí)的this為abruzzi alert(alertName.call(abruzzi));
引用是一個(gè)比較有意思的主題,跟其他的語(yǔ)言不同的是,JavaScript 中的引用始終指向最終的對(duì)象,而并非引用本身
var obj = {}; // 空對(duì)象 var ref = obj; // 引用 obj.name = "objectA" ; alert(ref . name); //ref 跟著添加了 name 屬性 obj = ["one" , "two" , "three"]; //obj 指向了另一個(gè)對(duì)象 ( 數(shù)組對(duì)象 ) alert(ref.name); //ref 還指向原來的對(duì)象 alert(obj.length ); //3 alert(ref.length);
obj 只是對(duì)一個(gè)匿名對(duì)象的引用,所以, ref 并非指向它.
引用指向的只能是具體的對(duì)象,當(dāng)具體對(duì)象改變的時(shí)候,引用還是引用原來的對(duì)象,而不是改變后的對(duì)象。
以上所述是小編給大家介紹的JavaScript中的this指針和引用知識(shí),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
JavaScript 一行代碼,輕松搞定浮動(dòng)快捷留言-V2升級(jí)版
前天熬了大半宿發(fā)了一篇[一行代碼輕松搞定快捷留言功能],同時(shí)發(fā)布了V1.0beta版的快捷留言功能和源代碼,之所以是beta版,就是當(dāng)時(shí)感覺雖然基本功能有了,但是還不夠完善,特性也不一定合理2010-04-04用roll.js實(shí)現(xiàn)的圖片自動(dòng)滾動(dòng)+鼠標(biāo)觸動(dòng)的特效
用roll.js實(shí)現(xiàn)的圖片自動(dòng)滾動(dòng)+鼠標(biāo)觸動(dòng)的特效...2007-03-03js判斷手機(jī)訪問或者PC的幾個(gè)例子(常用于手機(jī)跳轉(zhuǎn))
js判斷手機(jī)或者PC的例子我們?cè)趲缀跛芯W(wǎng)站都會(huì)有這段代碼了,現(xiàn)在手機(jī)流量與pc差不多了,下面來看兩段js判斷手機(jī)或者PC例子吧2015-12-12Highcharts使用簡(jiǎn)例及異步動(dòng)態(tài)讀取數(shù)據(jù)
Highcharts 是一個(gè)用純JavaScript編寫的一個(gè)圖表庫(kù), 能夠很簡(jiǎn)單便捷的在web網(wǎng)站或是web應(yīng)用程序添加有交互性的圖表,并且免費(fèi)提供給個(gè)人學(xué)習(xí)、個(gè)人網(wǎng)站和非商業(yè)用途使用,通過本文給大家介紹Highcharts使用簡(jiǎn)例及異步動(dòng)態(tài)讀取數(shù)據(jù)的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2015-12-12JS實(shí)現(xiàn)多物體運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)多物體運(yùn)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05js select option對(duì)象小結(jié)
本篇文章主要是對(duì)js中的select option對(duì)象進(jìn)行了總結(jié)介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12IE6/7 and IE8/9/10(IE7模式)依次隱藏具有absolute或relative的父元素和子元素后再顯示
多數(shù)情況下隱藏(設(shè)置display:none)一個(gè)元素,無需依次將其內(nèi)的所有子元素都隱藏。非要這么做,有時(shí)會(huì)碰到意想不到的bug。2011-07-07JavaScript事件機(jī)制的剖析與優(yōu)化詳解
在現(xiàn)代前端開發(fā)中,JavaScript事件處理是一個(gè)至關(guān)重要的部分,它能夠使網(wǎng)頁(yè)與用戶交互,實(shí)現(xiàn)豐富的交互體驗(yàn),然而,對(duì)JavaScript事件機(jī)制的深入理解是開發(fā)者成為優(yōu)秀前端工程師的關(guān)鍵所在,本文將全面剖析JavaScript事件機(jī)制,需要的朋友可以參考下2023-12-12