討論js里 this的指向情況

在JavaScript中旗扑,this是當(dāng)前執(zhí)行函數(shù)的環(huán)境濒生。因?yàn)镴avaScript有4種不同的函數(shù)調(diào)用方式:

函數(shù)調(diào)用: alert('Hello World!')

方法調(diào)用: console.log('Hello World!')

構(gòu)造函數(shù)調(diào)用: new RegExp('\d')

隱式調(diào)用: alert.call(undefined, 'Hello World!')

并且每種方法都定義了自己的上下文完慧,this會(huì)表現(xiàn)得跟我們預(yù)期的不太一樣。同時(shí),strict模式也會(huì)影響函數(shù)執(zhí)行時(shí)的上下文锈遥。

理解this的關(guān)鍵點(diǎn)就是要對(duì)函數(shù)調(diào)用以及它所處的環(huán)境有個(gè)清晰的觀點(diǎn)纫事。這篇文章將會(huì)著重于對(duì)函數(shù)調(diào)用的解釋、函數(shù)調(diào)用如何影響this以及展示確定環(huán)境時(shí)常見(jiàn)的陷阱所灸。



下面列舉一些this常用的場(chǎng)景丽惶,希望可以對(duì)讀者有所幫助:

一、普通函數(shù)里的this指向:普通函數(shù)中的this指針指向于調(diào)用者爬立;

this 在函數(shù)調(diào)用中是一個(gè)全局對(duì)象钾唬,全局對(duì)象是由執(zhí)行的環(huán)境決定的。在瀏覽器里它是window對(duì)象侠驯。

function fn (){

??? this.name = '小璇';

??? console.log(this);?? // 此處打印window

? ? console.log(this.name);? // 此處打印小璇

}

fn()抡秆;

二、在定時(shí)器中的this的指向:

function CreatePerson () {

?????? this.name = '小璇';

?????? setInterval(function(){

? ? ? ?? console.log(this);

?}, 2000) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // ? this指向與構(gòu)造函數(shù)創(chuàng)建的對(duì)象:this的調(diào)用者是new


????? // setInterval(this.show, 2000); ? ? //? 由new來(lái)給定時(shí)器綁定一個(gè)函數(shù)


????? // setInterval(function(){ ? ? ? ? ?? ?? // this指向于window吟策;因?yàn)閠his是由定時(shí)器調(diào)起執(zhí)行的

????? //? ? console.log(this);

????? // }, 2000);???????????????????????????????? //把this的指向固定在self變量中


var slef = this;

????? setInterval(function(){???????????????? // 此時(shí)儒士,self指向的是對(duì)象

????????? self.show();

????? }, 2000);

}

CreatePerson.prototype.show = function (){

// console.log('hello');

console.log(this);

}

三、在對(duì)象方法中的this指針指向:

var name = '小李子';

var per = {

????? name: '小璇',

????? fn: function () {

???? ? ? ?? console.log(this.name);

?????? }

}

per.fn();?????????????? //this指針指向了per

var obj = per.fn;??

window.obj();? ? ? ? // fn方法交給了window對(duì)象調(diào)用檩坚,所以方法中的this指針指向了window對(duì)象

四着撩、在構(gòu)造函數(shù)中的調(diào)用:

function CreatePerson() {

this.name = '小璇';

// 如果在構(gòu)造函數(shù)中向外返回一個(gè)對(duì)象,則該對(duì)象會(huì)覆蓋由new創(chuàng)建出來(lái)的對(duì)象

// return {

//? ? name: '小李子'

// }

// 構(gòu)造函數(shù)不能向外返回引用類(lèi)型匾委,因?yàn)榉祷氐囊妙?lèi)型會(huì)替換掉new創(chuàng)建出來(lái)的對(duì)象

// 如果向外返回的是null對(duì)象睹酌,則不會(huì)替換

return null;

}

// 因?yàn)閚ew調(diào)用函數(shù)執(zhí)行時(shí):1、開(kāi)辟一塊內(nèi)存空間剩檀;2憋沿、把函數(shù)中this的指向指為這塊空間;3、把創(chuàng)建出來(lái)的空間交給變量

var per = new? CreatePerson();

console.log(per.name);

五沪猴、在事件函數(shù)中的this的指向:

function Btn() {

????? this.b = 23;???? 這里的this指向調(diào)用者new

????? var _this = this;? //凝固指針

????? document.getElementById('btn').onclick = function (){

????? // this.show();

????? _this.show();?? //這里的指針依舊是new辐啄,而不是點(diǎn)擊事件的標(biāo)簽

????? };

}

window.onload = function () {

????? new Btn();

}

六、事件函數(shù)中this的指向

var btn = document.querySelector('#btn');

btn.onclick = function () {

console.log(this);

// 如果事件函數(shù)中嵌套了函數(shù)运嗜,該函數(shù)又出現(xiàn)了this指針壶辜,則該指針指向window對(duì)象

?? hello()??? // 此時(shí)下方被調(diào)用的hello函數(shù)里的this指向window

// hello.call(this);??? //此時(shí)下方被調(diào)用的hello函數(shù)里this指向點(diǎn)擊事件的標(biāo)簽,使用call扭轉(zhuǎn)this的指向到當(dāng)前作用域的this担租;

}

function hello() {

this.style.backgroundColor = 'red';

}

結(jié)論:

因?yàn)楹瘮?shù)調(diào)用對(duì)this有最大的影響砸民,從現(xiàn)在起,不要再問(wèn)你自己:

this是從哪里來(lái)的奋救?

而要問(wèn)自己:函數(shù)是怎么被調(diào)用的

對(duì)于有指向的函數(shù)岭参,問(wèn)問(wèn)你自己:

在這個(gè)有指向的函數(shù)被定義的環(huán)境,this是什么尝艘?

這是處理this時(shí)的正確想法演侯,它們可以讓你免于頭痛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末背亥,一起剝皮案震驚了整個(gè)濱河市秒际,隨后出現(xiàn)的幾起案子悬赏,更是在濱河造成了極大的恐慌,老刑警劉巖娄徊,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闽颇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寄锐,警方通過(guò)查閱死者的電腦和手機(jī)兵多,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锐峭,“玉大人中鼠,你說(shuō)我怎么就攤上這事可婶⊙伛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵矛渴,是天一觀的道長(zhǎng)椎扬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)具温,這世上最難降的妖魔是什么蚕涤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮铣猩,結(jié)果婚禮上揖铜,老公的妹妹穿的比我還像新娘。我一直安慰自己达皿,他們只是感情好天吓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著峦椰,像睡著了一般龄寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汤功,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天物邑,我揣著相機(jī)與錄音,去河邊找鬼滔金。 笑死色解,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的餐茵。 我是一名探鬼主播冒签,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钟病!你這毒婦竟也來(lái)了萧恕?” 一聲冷哼從身側(cè)響起刚梭,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎票唆,沒(méi)想到半個(gè)月后朴读,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡走趋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年衅金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片簿煌。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氮唯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姨伟,到底是詐尸還是另有隱情惩琉,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布夺荒,位于F島的核電站瞒渠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏技扼。R本人自食惡果不足惜伍玖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剿吻。 院中可真熱鬧窍箍,春花似錦、人聲如沸丽旅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)魔招。三九已至晰搀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間办斑,已是汗流浹背外恕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乡翅,地道東北人鳞疲。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蠕蚜,于是被迫代替她去往敵國(guó)和親尚洽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 葡萄藤PPT JS中this的指向 大家好靶累,我是IT修真院鄭州分院第6期的學(xué)員王棟腺毫,一枚正直癣疟、純潔、善良的前端程序...
    17064閱讀 619評(píng)論 0 2
  • 工廠模式類(lèi)似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品潮酒,去做同樣的事情睛挚,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 7,724評(píng)論 2 17
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象急黎,但只有一個(gè)實(shí)例扎狱,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見(jiàn)的單例模式勃教,...
    Obeing閱讀 2,058評(píng)論 1 10
  • 首先必須要說(shuō)的是淤击,this的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰(shuí)故源,實(shí)際上...
    Mr__王閱讀 728評(píng)論 0 3
  • 沒(méi)搞錯(cuò)吧污抬!js寫(xiě)了那么多年,this還是會(huì)搞錯(cuò)心软!沒(méi)搞錯(cuò)壕吹,javascript就是回搞錯(cuò)著蛙! ………… 在寫(xiě)java的...
    zhoulujun閱讀 1,436評(píng)論 0 11