談this第二篇

非原創(chuàng):

想要確定this的指向弛说,需要分下列幾種情況進(jìn)行討論:


全局代碼中的this

函數(shù)中的this

其中函數(shù)中的this比較復(fù)雜,也更為常見特笋,下面會(huì)著重說明剃浇。


全局代碼中的 THIS


這個(gè)很好理解巾兆,就是指向全局對象window猎物,如果是嚴(yán)格模式則是undefined,下面為了簡便角塑,直接用global代替蔫磨,不再對是否是嚴(yán)格模式進(jìn)行區(qū)分。


this.a = 10

console.log(a) // 10


b = 20

console.log(this.b) // 20


var c = 30

console.log(this.c) // 30

函數(shù)中的 THIS


先上結(jié)論:


函數(shù)上下文中的this值由調(diào)用者提供圃伶,并由表達(dá)式的形式確定堤如;

如果在調(diào)用括號(hào)的左側(cè)存在引用類型的值,則將this設(shè)置為該引用類型的base對象窒朋;

在所有其他情況下搀罢,this的值始終設(shè)置為null,因?yàn)閚ull沒有意義侥猩,所以被隱式轉(zhuǎn)換為全局對象榔至。

結(jié)論中的細(xì)節(jié)下面將會(huì)介紹。


引用類型


為了理解方便欺劳,先介紹一個(gè)基本概念:


引用類型可以表示為對象唧取,base是屬性所屬的對象,propertyName是此對象中屬性的名字划提,strict表示是否為嚴(yán)格模式枫弟。

var foo = 10

function bar() {}

可以理解成:


var fooReference = {

? base: global,

? propertyName: 'foo'

}


var barReference = {

? base: global,

? propertyName: 'bar'

}

OK,那么下面再來兩個(gè) 融會(huì)貫通一下鹏往。


function foo() {

? ? console.log(this)

}


foo() // global


var fooReference = {

? ? base: global,

? ? propertyName: 'foo'

}

結(jié)論很顯然淡诗,括號(hào)左邊是foo函數(shù),即window.foo()伊履,引用類型韩容,那么this指向base,即global湾碎。


擴(kuò)展一下:


foo.prototype.constructor() // foo.prototype


var fooPrototypeConstructorReference = {

? base: foo.prototype,

? property?Name: 'constructor'

}

同樣的判斷方法~

再來一個(gè) :

function foo() {

? console.log(this.bar)

}

var x = { bar: 10 }

var y = { bar: 20 }

x.test = foo

y.test = foo

x.test() // 10

y.test() // 20

var xTestReference = {

? base: x,

? propertyName: 'test'

}

// y應(yīng)該不用再寫了吧

非引用類型

非引用類型就一句話:全局對象宙攻。

老規(guī)矩,舉 :

(function() {

? console.log(this) // null => global

})()

// 括號(hào)內(nèi)?為函數(shù)聲明介褥,并非引用

下面的? 可能會(huì)讓人困惑:

var foo = {

? bar: function() {

? ? console.log(this)

? }

}

foo.bar() // Reference, OK => foo

(foo.bar)() // Reference, OK => foo

(foo.bar = foo.bar)() // global

(false || foo.bar)() // global

(foo.bar, foo.bar)() // global

后三組由于進(jìn)行?了賦值和運(yùn)算座掘,因此base丟失递惋,他們其實(shí)都變成了函數(shù)聲明,因此類似于自執(zhí)行函數(shù)溢陪,this指向global萍虽。

另外兩種情況

還有兩種情況,如果作為構(gòu)造函數(shù)被調(diào)用形真,指向?qū)嵗瘜ο笊急啵蝗绻莄all和apply調(diào)用,指向?他們的參數(shù)咆霜。

一點(diǎn)想法

this的指向確實(shí)是個(gè)比較?麻煩的點(diǎn)邓馒,理解上不困難,但是有些點(diǎn)需要記憶蛾坯,我覺得比較合適的方式是光酣,在用到過程中學(xué)習(xí)this,比如react中為什么要在constructor中?bind(this)脉课,為什么Vue的組件中救军,data中的數(shù)據(jù)要寫在return中,通過這種方式具體的學(xué)習(xí)?this更加實(shí)際倘零。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唱遭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呈驶,更是在濱河造成了極大的恐慌拷泽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俐东,死亡現(xiàn)場離奇詭異跌穗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虏辫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蚌吸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砌庄,你說我怎么就攤上這事羹唠。” “怎么了娄昆?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵佩微,是天一觀的道長。 經(jīng)常有香客問我萌焰,道長哺眯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任扒俯,我火速辦了婚禮奶卓,結(jié)果婚禮上一疯,老公的妹妹穿的比我還像新娘。我一直安慰自己夺姑,他們只是感情好墩邀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盏浙,像睡著了一般眉睹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上废膘,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天竹海,我揣著相機(jī)與錄音,去河邊找鬼殖卑。 笑死站削,一個(gè)胖子當(dāng)著我的面吹牛坊萝,可吹牛的內(nèi)容都是我干的孵稽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼十偶,長吁一口氣:“原來是場噩夢啊……” “哼菩鲜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惦积,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤接校,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狮崩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛛勉,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年睦柴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诽凌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坦敌,死狀恐怖侣诵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狱窘,我是刑警寧澤杜顺,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蘸炸,受9級(jí)特大地震影響躬络,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搭儒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一穷当、第九天 我趴在偏房一處隱蔽的房頂上張望越锈。 院中可真熱鬧,春花似錦膘滨、人聲如沸甘凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丹弱。三九已至,卻和暖如春铲咨,著一層夾襖步出監(jiān)牢的瞬間躲胳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工纤勒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坯苹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓摇天,卻偏偏與公主長得像粹湃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子泉坐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理为鳄,服務(wù)發(fā)現(xiàn),斷路器腕让,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 一孤钦、你不知道的JavaScript 1、作用域 作用域 LHS RHS RHS查詢與簡單地查找某個(gè)變量的值別無二...
    頂兒響叮當(dāng)閱讀 345評(píng)論 0 0
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)纯丸,也就是一...
    悟名先生閱讀 4,131評(píng)論 0 13
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,128評(píng)論 0 3
  • 1偏形、調(diào)用位置 在理解this的綁定之前,首先理解調(diào)用位置,決定this的綁定 function a() { // ...
    winerss閱讀 298評(píng)論 0 0