what is "this" in JavaScript

前言

關(guān)于javascript中的this究竟指的是什么杠巡,已經(jīng)有很多文章寫過庇楞,在這里總結(jié)一下憋活。

書中的重要觀點(diǎn)

  1. this的指向并不是指向函數(shù)本身或函數(shù)的詞法作用域潘明;
  2. this的值是在函數(shù)調(diào)用時(shí)才綁定的祠汇,創(chuàng)建時(shí)并沒有綁定this;
  3. this的指向取決于在何處被調(diào)用瓢捉。

函數(shù)的調(diào)用模式

在說this的綁定方式之前笨忌,我們先談?wù)労瘮?shù)的調(diào)用蓝仲。調(diào)用一個(gè)函數(shù)時(shí),會(huì)暫停當(dāng)前函數(shù)的執(zhí)行傳遞控制權(quán)和參數(shù)給調(diào)用的函數(shù)官疲。除了函數(shù)聲明時(shí)定義的形參袱结,函數(shù)還會(huì)接受兩個(gè)附加的參數(shù): arguments和this,arguments即函數(shù)的入?yún)⑼举欤瑃his的指向和函數(shù)的調(diào)用模式有關(guān)垢夹。

在javascript中,函數(shù)的調(diào)用模式一般分為四種:方法調(diào)用模式维费、函數(shù)調(diào)用模式果元、構(gòu)造器調(diào)用模式、apply調(diào)用模式犀盟。

  1. 方法調(diào)用模式
    當(dāng)一個(gè)函數(shù)作為一個(gè)對(duì)象的一個(gè)屬性時(shí)而晒,我們稱之為方法。當(dāng)一個(gè)方法被調(diào)用時(shí)阅畴,函數(shù)的this指向調(diào)用該方法的對(duì)象倡怎。
  2. 函數(shù)調(diào)用模式
    當(dāng)一個(gè)函數(shù)不作為一個(gè)對(duì)象的屬性時(shí),就是我們最常見的函數(shù)調(diào)用模式贱枣。在這種情況下如果是非嚴(yán)格模式(non-strict mode)下運(yùn)行則this指向全局對(duì)象监署,瀏覽器下為window,node模式下為global纽哥。
  3. 構(gòu)造器調(diào)用模式
    當(dāng)一個(gè)函數(shù)被當(dāng)做“構(gòu)造函數(shù)”(嚴(yán)格來講構(gòu)造函數(shù)和普通函數(shù)沒有區(qū)別)焦匈,當(dāng)我們用關(guān)鍵字new來以“構(gòu)造函數(shù)”為藍(lán)圖來創(chuàng)建一個(gè)對(duì)象時(shí),函數(shù)中的this就會(huì)指向創(chuàng)建的對(duì)象實(shí)例昵仅。
  4. apply調(diào)用模式
    apply方法讓我們構(gòu)建一個(gè)參數(shù)數(shù)組傳給需要調(diào)用的函數(shù),apply接受兩個(gè)參數(shù),第一個(gè)為this綁定的值摔笤,第二個(gè)即需要傳入的參數(shù)數(shù)組够滑。apply方法可以顯式地綁定this的值,類似的還有bind和call吕世,需要注意地是彰触,bind方法是返回一個(gè)新的函數(shù)。

this判斷規(guī)則

  1. 看是否由 new 調(diào)用命辖?是則綁定到新創(chuàng)建的對(duì)象况毅。
  2. 再看是否由 call 或者 apply (或者 bind )調(diào)用?綁定到指定的對(duì)象尔艇。
  3. 看函數(shù)是否為上下文對(duì)象的方法調(diào)用尔许?是則綁定到那個(gè)上下文調(diào)用方法的對(duì)象。(特點(diǎn)是用"."或者"[ ]"來調(diào)用)
  4. 默認(rèn)函數(shù)調(diào)用:在嚴(yán)格模式下綁定到 undefined 终娃,否則綁定到全局對(duì)象味廊。
    ES6 中的箭頭函數(shù)并不會(huì)使用四條標(biāo)準(zhǔn)的綁定規(guī)則,而是根據(jù)當(dāng)前的詞法作用域來決定this 棠耕,具體來說余佛,箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的 this 綁定(無論 this 綁定到什么)。這其實(shí)和 ES6 之前代碼中的 self = this 機(jī)制一樣窍荧。

tips:

  1. 回調(diào)函數(shù)丟失 this 綁定是非常常見的辉巡,如settimeout();
  2. 一些流行的JavaScript 庫中事件處理器常會(huì)把回調(diào)函數(shù)的 this 強(qiáng)制綁定到觸發(fā)事件的 DOM 元素上蕊退。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郊楣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咕痛,更是在濱河造成了極大的恐慌痢甘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茉贡,死亡現(xiàn)場(chǎng)離奇詭異塞栅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腔丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門放椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愉粤,你說我怎么就攤上這事砾医。” “怎么了衣厘?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵如蚜,是天一觀的道長压恒。 經(jīng)常有香客問我,道長错邦,這世上最難降的妖魔是什么探赫? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮撬呢,結(jié)果婚禮上伦吠,老公的妹妹穿的比我還像新娘。我一直安慰自己魂拦,他們只是感情好毛仪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芯勘,像睡著了一般箱靴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上借尿,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天刨晴,我揣著相機(jī)與錄音,去河邊找鬼路翻。 笑死狈癞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茂契。 我是一名探鬼主播蝶桶,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼掉冶!你這毒婦竟也來了真竖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤厌小,失蹤者是張志新(化名)和其女友劉穎恢共,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧亚,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讨韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癣蟋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片透硝。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疯搅,靈堂內(nèi)的尸體忽然破棺而出濒生,到底是詐尸還是另有隱情,我是刑警寧澤幔欧,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布罪治,位于F島的核電站丽声,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏规阀。R本人自食惡果不足惜恒序,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谁撼。 院中可真熱鬧,春花似錦滋饲、人聲如沸厉碟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箍鼓。三九已至,卻和暖如春呵曹,著一層夾襖步出監(jiān)牢的瞬間款咖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工奄喂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐殃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓跨新,卻偏偏與公主長得像富腊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子域帐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 函數(shù)和對(duì)象 1赘被、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句肖揣,而且...
    道無虛閱讀 4,563評(píng)論 0 5
  • 1.概念 在JavaScript中民假,this 是指當(dāng)前函數(shù)中正在執(zhí)行的上下文環(huán)境,因?yàn)檫@門語言擁有四種不同的函數(shù)調(diào)...
    BluesCurry閱讀 1,129評(píng)論 0 2
  • 1. this之謎 在JavaScript中龙优,this是當(dāng)前執(zhí)行函數(shù)的上下文羊异。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 998評(píng)論 0 3
  • 關(guān)于 this this 關(guān)鍵字是 JavaScript 中最復(fù)雜的機(jī)制之一。它是一個(gè)很特別的關(guān)鍵字陋率,被自動(dòng)定義在...
    游學(xué)者灬墨槿閱讀 572評(píng)論 1 2
  • JavaScript語言精粹 前言 約定:=> 表示參考相關(guān)文章或書籍; JS是JavaScript的縮寫球化。 本書...
    微笑的AK47閱讀 581評(píng)論 0 3