Javascript中的this該何去何從

?在初階段我看js中的時(shí)候簡直就是一臉蒙B,跟現(xiàn)在的棒子國的女人一樣,看來看去都是一個(gè)樣,但是根本上還是不知道出自那個(gè)醫(yī)生之手。

看完我這篇文章解析之后,你再到大街上蹲點(diǎn)去看看那些girl臉,那些是true or false,為了證實(shí)你真的看懂的js的this,你再去問問那些girl我說的是對的麻,但我不保證你不被打死。

本文規(guī)定 ?//=> ?后面指的都是輸出的結(jié)果


我們在游覽器上先打印出最簡單的this.看看是什么鬼


我在瀏覽器里console.log(this) ? ? //打印出window{......} ?打印出一個(gè)window對象

函數(shù)中執(zhí)行時(shí)this的指向(1)最原始的函數(shù)調(diào)用


//=>window{.....} ? 此時(shí)輸出的還是window對象,因?yàn)楹瘮?shù)被調(diào)用的情況下為全局對象,所以this.指向的為window對象,?

函數(shù)中執(zhí)行時(shí)this的指向(2)最原始的函數(shù)調(diào)用 ‘use strict'

//=>undefined ?此時(shí)輸出了一個(gè)underfined,在嚴(yán)格模式下此時(shí)對this.不會指向全局,而是全指向一個(gè)underfined ,以避免在寫代碼時(shí)出現(xiàn)一些莫名的情況,本來js就是一個(gè)不嚴(yán)謹(jǐn)?shù)恼Z言

作為一個(gè)對象字面量的方法調(diào)用時(shí)this的指向


//=>"ziksang" ?此時(shí)輸出一個(gè)字符串ziksang ?此時(shí)的this指向的是obj對象,此時(shí)調(diào)用的this是根據(jù)運(yùn)行時(shí)找到this的指向 ,指向的是obj對象,而obj對象下面有一個(gè)name為ziksang的屬性,所以運(yùn)行時(shí)候打印出的就是ziksang ?

后面還要講到一個(gè)定義時(shí)this指向的對象,所以我們一定要搞定運(yùn)行時(shí)和定義時(shí)this的不同

徹底講清this運(yùn)行時(shí)指向的對象


//=>ziksang? 根據(jù)前面的知識調(diào)用say()方法時(shí)我們一目了解的知道this.指向的是window對象,而window對象下面掛著一個(gè)name屬性,所以調(diào)用this.name指向的是window下name的屬性值,在這里我加了一個(gè)嚴(yán)格模式,如果不加'use strict',我不定義name屬性則不會報(bào)錯(cuò),因?yàn)樽兞刻嵘脑颍恿酥?則會報(bào)一個(gè)

Uncaught TypeError: Cannot read property 'name' of undefined?。。∫馑颊f沒有name這個(gè)屬性 ,這些只是一個(gè)運(yùn)行時(shí)指向的一個(gè)鋪墊講解,讓我們?nèi)タ纯窗糇觤m到底怎么整成一個(gè)像一個(gè)娘養(yǎng)出來的


obj.say() //=> obj{} ? ?此時(shí)obj.say()打印出來是一個(gè)obj對象,此時(shí)say方法里面的this.不是指向window對象麻 ?? 只是obj里面定義了一個(gè)say方法引用了say函數(shù),說明一點(diǎn)此時(shí)say函數(shù)this是運(yùn)行時(shí)才指向的, ?指向了obj對象

obj2() //=>window{}對象 ?此時(shí)obj2()指向的是window對象 ,因?yàn)閛bj2是一個(gè)全局對象,掛在window下的,只是把obj.say對象的方法賦值給obj2變量,指行obj2() 指向的了window對象,這更說明了無論this定義時(shí)指向那里不是我們關(guān)心的,我們更關(guān)心,執(zhí)行this時(shí)的運(yùn)行環(huán)鏡指向那里更為重要

再來一點(diǎn)惡心的東西,就是那些沒牌沒證的棒子醫(yī)生,setTimeout里this的指向


理所當(dāng)然的想法輸出//=>ziksang

? obj.say() //=> 有軍魂 ?突然一看又是一臉蒙B 前面還好好的this.name指向obj里的name屬性,為什么加一個(gè)settimeout就變了呢??還是要說到this運(yùn)行時(shí)指向的對象,因?yàn)閟etTimeout是window對象的方法,你造也造不出來,你改也改不掉!那此時(shí)this.name運(yùn)行時(shí)理所當(dāng)然的就指向了window對向下的name屬性,我在全局對象上掛了一個(gè)name屬性"有軍魂"!所以最后打印出有軍魂 ??

如何整治無證無牌上路的老司機(jī),直接打掉黑作坊 ?用閉包改變this的指向


obj.say() //=> “ziksang” ?我們改變了setTimeout運(yùn)行時(shí)的指向,

在say方法里加一個(gè)局部作用域,把指向obj對象的this賦值給_this

,在setTimeout調(diào)用時(shí)直接改面其指向的window對向,硬改成obj對象,就能輸出ziksang

寧愿被打臉也要說出事實(shí),不向棒子妥協(xié) ,別以為偷偷換臉就認(rèn)不出你, this隱式改變 ??


test() //=> undefined ?前面講過在嚴(yán)格模式下 ,原生的調(diào)用函數(shù)this不會指向window對象,而是打印出一個(gè)undefined。

為什么?為什么?setTimeout執(zhí)行 //=>輸出 window對象 ?, 你服不服,反正我心里是不服,不是被啪啪打臉,不服也不行,直接看原因吧,因?yàn)閟etTimeout里面執(zhí)行的匿名函數(shù)會隱式改變其this的指向,指向window。這一點(diǎn)大家一定要記在心里,臉不能被白打,吃一塹長一智!

構(gòu)造函數(shù)里的this


構(gòu)造函數(shù)和普通函數(shù)有什么區(qū)別?構(gòu)造函數(shù)用new去實(shí)例化一個(gè)對象 !普通函數(shù)則是直接調(diào)用

new Ziksang() //=>打印出來是Ziksang{name:"ziksang",__proto__:"object"} ?如果用new 構(gòu)造出來的函數(shù)this指向這個(gè)構(gòu)造器的本身 constructor指向Ziksang,本質(zhì)上來說this和constructor指的是同一個(gè)地方

Ziksang()用函數(shù)調(diào)用的話 就像我們前面說的一樣指的是window對象,嚴(yán)格模式下指的是undefined;

ECAMscript6就像中國的整容醫(yī)生,這抄一點(diǎn)那抄一點(diǎn)就是全球第一? ECAM6中的this ?箭頭函數(shù)


在這這里面你看出來什么!看出來什么 ?

我擦輸出肯定是//=》有軍魂 ?

? 我莫名的感覺臉又腫了起來,前面還指向window對象下的this ?就變了一個(gè)寫法就又變了,

前面講的是運(yùn)行時(shí)的環(huán)境,但如果用了es6那就是定義時(shí)的環(huán)境了。

正確輸出 //=》ziksang ?因?yàn)橛昧思^函數(shù)時(shí) ,this指向的是定義時(shí)的對向,此時(shí)定義在obj對象里,雖然運(yùn)行時(shí)指向的是window對象,但是只要使用箭頭函數(shù)就會指向定義時(shí)指向的對象,所以這里輸出了ziksang ?


裝個(gè)B總結(jié)一下,打LOL去了



還有一個(gè)小細(xì)節(jié)當(dāng)箭頭函數(shù)運(yùn)行時(shí)用call apply bind來改變其this指向也是TNN的不可能的,孩子別意想天開了,ES6就是想讓Javascript的運(yùn)行環(huán)境越來越規(guī)范,不要意想天開了孩子

寫到這里我也累了,其實(shí)這個(gè)this還可以更深層次的講,那就是用call apply bind來改變其this的指向,但作為我的想法就是一步一步來,之所謂深入了解,和解剖分析,就是讓大家一步一步進(jìn)入javascript的世界,真正知道javascript中的this改何去何從,實(shí)在憋不住LoL的誘惑了,你們誰改與我一戰(zhàn) ? ? ?黑色玫瑰 ?QQ494755899 ?外號ziksang ?SOLO我能把你打的回家深入了解this

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容