js 中的 this

要選出 js 中最讓初學(xué)者最頭疼的概念, this 必定占其中的前 3 名贺氓。不像 cpp, java 或者 python,js 在任意函數(shù)中都能使用 this戚宦。并其 this 在 js 中更類似于動(dòng)態(tài)作用域艺配。即 this 并不是在定義時(shí)決定,而是在函數(shù)調(diào)用時(shí)才決定伙菜。這種決定綁定到哪個(gè) this 的行為稱為 this 綁定轩缤。例如通過(guò)一個(gè)普通函數(shù)調(diào)用時(shí),this 實(shí)際上是綁定到全局對(duì)象(瀏覽器環(huán)境為 window贩绕,node 環(huán)境為 global):

function bar(){
  this.a = 1;
}
bar()
console.info(global.a)

默認(rèn)綁定

默認(rèn)綁定是指通過(guò)調(diào)用普通函數(shù)的方式進(jìn)行綁定火的,也就是上文提到的綁定方式:

function bar(){
  this.a = 1;
}
bar()
console.info(global.a) //1

隱式綁定

隱式綁定是指該函數(shù)通過(guò)對(duì)象的成員函數(shù)的方式調(diào)用,此時(shí) this 會(huì)綁定到調(diào)用的對(duì)象淑倾。例如:

global.a = 1
obj = {
    a: 2,
    bar: function(){
        console.info(this.a)
    }
}
obj.bar() // 2

注意要強(qiáng)調(diào)的一點(diǎn)是馏鹤,this 綁定始終只和調(diào)用方式有關(guān),而和定義的方式無(wú)關(guān)娇哆,例如:

global.a = 1
function bar(){
    console.info(this.a)
}
obj = {
    a: 2
}
obj.bar = bar
obj.bar() // 2

雖然 bar 定義在全局環(huán)境中湃累,但仍然綁定到 obj 而不是全局對(duì)象。

隱式綁定丟失

由于綁定只和調(diào)用有關(guān)碍讨,因此如果一個(gè)成員函數(shù)通過(guò)普通函數(shù)的調(diào)用方式進(jìn)行調(diào)用治力,那么它 this 就會(huì)綁定到全局變量,例如:

global.a = 1
obj = {
    a: 2,
    bar: function(){
        console.info(this.a)
    }
}
const bar = obj.bar
bar() // 1

可以看出勃黍,此時(shí) this 綁定到了全局對(duì)象宵统。還有一種更不容易發(fā)現(xiàn)的情況,即將成員函數(shù)當(dāng)成回調(diào)函數(shù)使用溉躲,由于存在一種類似的賦值行為榜田,也會(huì)產(chǎn)生對(duì)應(yīng)的丟失問(wèn)題,例如:

var a = 1
obj = {
    a: 2,
    bar: function(){
        console.info(this.a)
    }
}
setInterval(obj.bar, 1000) // 1 1 1 1 1

這就能解釋為什么在 react 中需要手動(dòng)綁定 this锻梳。

顯式綁定

通過(guò) call 或者 apply 能夠顯示的綁定對(duì)象到 this:

function bar(){
    console.info(this.a)
}
bar.call({a: 1}) //1
bar.call({a: 2}) //2

硬綁定

為了避免在傳遞回調(diào)函數(shù)的時(shí)候丟失 this 綁定箭券,我們可以采用一種稱為硬綁定的方式,例如:

obj = {
    a: 1,
    bar: function(){
        console.info(this.a)
    }
}
function bind(bar, obj){
    function inner(){
        return bar.call(obj)
    }
    return inner
}
foo = bind(obj.bar, obj)
setInterval(foo, 1000)

通過(guò)實(shí)現(xiàn)一個(gè) bind 輔組函數(shù)來(lái)進(jìn)行綁定疑枯。此時(shí)辩块,就算我們將其作為一個(gè)回調(diào)函數(shù)也不會(huì)丟失 this 綁定。由于這種場(chǎng)景非常常見荆永,所以 js 內(nèi)置了 Function.prototype.bind 來(lái)實(shí)現(xiàn)硬綁定废亭。有的同學(xué)突發(fā)奇想,如果我們將一個(gè)硬綁定的函數(shù)再賦值給一個(gè)對(duì)象:

obj = {
    a: 1,
    bar: function(){
        console.info(this.a)
    }
}
obj.foo = obj.bar.bind({a: 3})
obj.foo() //3

可以看出具钥,仍然綁定到 {a: 3} 而不是 obj豆村。所以優(yōu)先級(jí)硬綁定 > 隱式綁定。

new 綁定

當(dāng)一個(gè)函數(shù)作為構(gòu)造函數(shù)使用時(shí)骂删,它會(huì)綁定到它創(chuàng)建的對(duì)象上掌动,例如:

function bar(){
    this.a = 1
}
const b = new bar()
console.info(b.a) // 1
console.info(global.a) // undefined
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末四啰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粗恢,更是在濱河造成了極大的恐慌柑晒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷射,死亡現(xiàn)場(chǎng)離奇詭異匙赞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)妖碉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門涌庭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人欧宜,你說(shuō)我怎么就攤上這事脾猛。” “怎么了鱼鸠?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)羹铅。 經(jīng)常有香客問(wèn)我蚀狰,道長(zhǎng),這世上最難降的妖魔是什么职员? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任麻蹋,我火速辦了婚禮,結(jié)果婚禮上焊切,老公的妹妹穿的比我還像新娘扮授。我一直安慰自己,他們只是感情好专肪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布刹勃。 她就那樣靜靜地躺著,像睡著了一般嚎尤。 火紅的嫁衣襯著肌膚如雪荔仁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天芽死,我揣著相機(jī)與錄音乏梁,去河邊找鬼。 笑死关贵,一個(gè)胖子當(dāng)著我的面吹牛遇骑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揖曾,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼落萎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亥啦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起模暗,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤禁悠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兑宇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍侦,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年隶糕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓷产。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枚驻,死狀恐怖濒旦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情再登,我是刑警寧澤尔邓,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站锉矢,受9級(jí)特大地震影響梯嗽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沽损,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一灯节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绵估,春花似錦炎疆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至躏救,卻和暖如春唯笙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盒使。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工崩掘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人少办。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓苞慢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親英妓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挽放,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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

  • 目錄this 是什么this 的四種綁定規(guī)則綁定規(guī)則的優(yōu)先級(jí)綁定例外擴(kuò)展:箭頭函數(shù)this 是什么理解this之前...
    18372a74d8b8閱讀 450評(píng)論 0 1
  • 最近在看《你不知道的JavaScript(上卷)》绍赛,覺得書中關(guān)于this的知識(shí)點(diǎn)講解的比較透徹易懂,在此做一些整理...
    jeff_nz閱讀 590評(píng)論 0 0
  • 1. 為什么要用this? this是js中最為復(fù)雜的機(jī)制之一纯出。大部分開發(fā)者寫了很久的js代碼都可能沒(méi)有主動(dòng)使用過(guò)...
    knowjs閱讀 299評(píng)論 0 1
  • 摘要:本文屬于原創(chuàng)蚯妇,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處:https://github.com/jasonGeng88/blo...
    Camilia_yang閱讀 341評(píng)論 0 0
  • 前言 近期對(duì)this很感興趣暂筝,于是乎簡(jiǎn)單整理了一些關(guān)于this的技術(shù)點(diǎn)箩言,加深一下對(duì)this的理解。 非箭頭函數(shù) 在...
    little_short閱讀 413評(píng)論 0 0