Javascript 中 this 的指向

? ?大家好侯养,我是IT修真院武漢第10期學(xué)員畔况,一枚正直鲸鹦、純潔、善良的前端程序員跷跪。

? ?今天給大家分享一下馋嗜,修真院官網(wǎng)任務(wù)js-2,深度思考的知識(shí)點(diǎn)——函數(shù)表達(dá)式跟函數(shù)聲明的區(qū)別;

1.背景介紹

JAVASCRIPT中THIS指的是什么吵瞻?

this是JavaScript語(yǔ)言中定義的眾多關(guān)鍵字之一葛菇,它的特殊在于它自動(dòng)定義于每一個(gè)函數(shù)域內(nèi),在函數(shù)運(yùn)行時(shí)橡羞,this會(huì)自動(dòng)生成一個(gè)內(nèi)部對(duì)象眯停,這個(gè)對(duì)象只能在函數(shù)內(nèi)部使用。同時(shí)卿泽,隨著函數(shù)使用場(chǎng)合的不同莺债,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則又厉,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)象椎瘟。

那什么THIS的指向又是什么呢覆致?

在JavaScript中,this是動(dòng)態(tài)綁定的肺蔚,它可以是全局對(duì)象煌妈、當(dāng)前對(duì)象或者任意對(duì)象,這完全取決于函數(shù)的調(diào)用方式。這就導(dǎo)致了this具備了多重含義璧诵,可以使得JavaScript更靈活的使用汰蜘。但是,帶來了靈活性的同時(shí)也會(huì)給我們初學(xué)者帶來不少困惑之宿。

2.知識(shí)剖析??

var name = '小明';

function look() {??? ?

????????var name = '二明';???

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

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

};?

look(); //小明

總結(jié):在全局作用域中它的 this 執(zhí)行當(dāng)前的全局對(duì)象(瀏覽器端是 Window)族操,所以才會(huì)在全局環(huán)境下查找'name',然后打印出來

var name = '小明';

var name2 = {??? ?

????????name: '二明',??? ?

????????age: 20,???

?????????look: function(){??? ???

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

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

????????}?

}?

name2.look();

這里的打印的結(jié)果是打印的第一個(gè)是二明比被,第二個(gè)是20色难。因?yàn)檎{(diào)用look函數(shù)的是name2這個(gè)對(duì)象,所以this指向的是name2中的name屬性的指向只在函數(shù)中定義的話是確定不了的等缀,只有當(dāng)被函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰(shuí)枷莉,也就是誰(shuí)調(diào)用了這個(gè)函數(shù)。

var name ='小明';

var name2 = {

????????name:'二明',

????????func:{

????????????????name:'三明',

????????????????look:function(){

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

????????????????}

????????}

}

name2.func.look();

這里的話尺迂,第一個(gè)是函數(shù)被name2調(diào)用的笤妙,本應(yīng)打印的是二明,但是最后的打印結(jié)果卻是三明噪裕,是為什么呢蹲盘。我們可以看下下面的圖

調(diào)用之間的關(guān)系

THIS的指向的三種情況

1.如果一個(gè)函數(shù)有this,但是它沒有被上一級(jí)對(duì)象所調(diào)用州疾,那么它指向的就是window辜限。在嚴(yán)格模式下指向的是undefined。

2.如果一個(gè)函數(shù)中有this严蓖,這個(gè)函數(shù)有被上一級(jí)所調(diào)用薄嫡,那么它指向的就是調(diào)用它的對(duì)象。

3.如果一個(gè)函數(shù)中有this颗胡,且這個(gè)函數(shù)外層被多個(gè)對(duì)象包含毫深,盡管最終這個(gè)函數(shù)是被最外層的對(duì)象所調(diào)用,this指向的也只是函數(shù)上一級(jí)的對(duì)象毒姨。

var name ='小明';

var name2 = {

????????name:'二明',

????????func:{

????????????????look:function(){

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

????????????????}

????????}

}

name2.func.look();//undefined

雖然函數(shù)look()最終是被func調(diào)用哑蔫,哪怕func中沒有name這個(gè)屬性,this指向的依然是func弧呐,所以打印的結(jié)果為undefined闸迷。但是還有一種特殊情況:

var name ='小明';

var name2 = {

????????name:'二明',

????????func:{

????????????????name:'三明',

????????????????look:function(){

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

????????????????}

????????}

}

var a = name2.func.look;

a();

這里的話this最終打印的是小明,卻不是我們想象中的三明俘枫,這是因?yàn)槲覀冎匦侣暶髯兞縜腥沽,并把look函數(shù)賦值給它,最后執(zhí)行函數(shù)a()的時(shí)候鸠蚪,調(diào)用a()是Window對(duì)象今阳。那句話:誰(shuí)調(diào)用this师溅,this就指向誰(shuí).

3、常見問題

現(xiàn)象:下面的代碼兩次打印的this不一樣

var obj = {??? ?

????????name: 'qiutc',??? ?

????????foo: function() {??? ??? ?

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

????????},??? ?

????????foo2: function() {?? ??? ?

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

????????????????setTimeout(this.foo, 1000);??? ?

????????}?

}?

obj.foo2();

4盾舌、解決方案

我們可以這么解決:利用 閉包 的特性來處理

var obj = {

????????name:'qiutc',

????????foo: function() {

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

????????},

????????foo2: function() {

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

????????????????var _this= this;

????????????????setTimeout(function() {

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

????????????????????????console.log(_this);// Object {name: "qiutc"}

????????????????},1000);

????????}

}

obj.foo2();

可以看到直接用 this 仍然是 Window墓臭;因?yàn)?foo2 中的 this 是指向 obj,我們可以先用一個(gè)變量 _this 來儲(chǔ)存妖谴,然后在回調(diào)函數(shù)中使用 _this窿锉,就可以指向當(dāng)前的這個(gè)對(duì)象了

執(zhí)行這段代碼我們會(huì)發(fā)現(xiàn)兩次打印出來的 this 是不一樣的:

第一次是 foo2 中直接打印 this,這里指向 obj 這個(gè)對(duì)象窖维,我們毋庸置疑榆综;

但是在 setTimeout 中執(zhí)行的 this.foo ,卻指向了全局對(duì)象铸史,這里不是把它當(dāng)作函數(shù)的方法使用嗎鼻疮?這一點(diǎn)經(jīng)常讓很多初學(xué)者疑惑;

其實(shí)琳轿,setTimeout 也只是一個(gè)函數(shù)而已判沟,函數(shù)必然有可能需要參數(shù),我們把 this.foo 當(dāng)作一個(gè)參數(shù)傳給 setTimeout 這個(gè)函數(shù)崭篡,就像它需要一個(gè) fun 參數(shù)挪哄,在傳入?yún)?shù)的時(shí)候,其實(shí)做了個(gè)這樣的?? ??? ?操作 fun = this.foo琉闪,看到?jīng)]有迹炼,這里我們直接把 fun 指向 this.foo 的引用;執(zhí)行的時(shí)候其實(shí)是執(zhí)行了 fun() 所以已經(jīng)和 obj 無關(guān)了颠毙,它是被當(dāng)作普通函數(shù)直接調(diào)用的斯入,因此 this 指向全局對(duì)象。

這個(gè)問題是很多異步回調(diào)函數(shù)中普遍會(huì)碰到的

6.擴(kuò)展思考

問題:當(dāng)this遇到return時(shí)會(huì)發(fā)生什么蛀蜜?

答:如果返回值是一個(gè)對(duì)象刻两,那么this指向的就是那個(gè)返回的對(duì)象,如果返回值不是一個(gè)對(duì)象那么this還是指向函數(shù)的實(shí)例

問題:當(dāng)this在一個(gè)對(duì)象里面的對(duì)像里滴某,這是this指向哪?

答:誰(shuí)調(diào)用this磅摹,this就指向誰(shuí);這時(shí)候指向的是這個(gè)對(duì)象霎奢;

問題:this看起來很簡(jiǎn)單户誓,有什么需要注意的么?

答:講起來肯定簡(jiǎn)單幕侠,用起來卻很復(fù)雜帝美。

7.參考文獻(xiàn)

參考一:徹底理解JS中this的指向

參考二:阮一峰的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芽腾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梯皿,更是在濱河造成了極大的恐慌腮考,老刑警劉巖乡范,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翩迈,死亡現(xiàn)場(chǎng)離奇詭異澈灼,居然都是意外死亡湿蛔,警方通過查閱死者的電腦和手機(jī)创译,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門抵知,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人软族,你說我怎么就攤上這事刷喜。” “怎么了立砸?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵掖疮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我颗祝,道長(zhǎng)浊闪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任螺戳,我火速辦了婚禮搁宾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倔幼。我一直安慰自己盖腿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布损同。 她就那樣靜靜地躺著翩腐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揖庄。 梳的紋絲不亂的頭發(fā)上栗菜,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音蹄梢,去河邊找鬼疙筹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛禁炒,可吹牛的內(nèi)容都是我干的而咆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼幕袱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼暴备!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起们豌,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤涯捻,失蹤者是張志新(化名)和其女友劉穎浅妆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體障癌,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凌外,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涛浙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片康辑。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轿亮,靈堂內(nèi)的尸體忽然破棺而出疮薇,到底是詐尸還是另有隱情,我是刑警寧澤我注,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布按咒,位于F島的核電站,受9級(jí)特大地震影響但骨,放射性物質(zhì)發(fā)生泄漏胖齐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一嗽冒、第九天 我趴在偏房一處隱蔽的房頂上張望呀伙。 院中可真熱鬧,春花似錦添坊、人聲如沸剿另。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雨女。三九已至,卻和暖如春阳准,著一層夾襖步出監(jiān)牢的瞬間氛堕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工野蝇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讼稚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓绕沈,卻偏偏與公主長(zhǎng)得像锐想,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乍狐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361