this全面解析

this到底是什么邻梆?

this是在運行的進行綁定的,并不是編寫時綁定的恩闻。他的上下文取決于函數(shù)調(diào)用的各種環(huán)境葫录。this的綁定和函數(shù)聲明的位置沒有任何關系,只取決與函數(shù)的調(diào)用方式赶熟。

this全面解析

調(diào)用位置

每個函數(shù)的this是在函數(shù)調(diào)用時綁定的瑰妄,完全取決于函數(shù)的調(diào)用位置。而不是聲明的位置


調(diào)用位置

綁定規(guī)則

1.默認綁定

如果使用非嚴格模式钧大,this默認指向全局對象(window);嚴格模式(strict mode),則不能將全局對象用于默認綁定翰撑,因此this會綁定到undefined;

2.隱式綁定

考慮調(diào)用位置是否有上下文對象

有上下文對象

對象屬性引用鏈中只有在上一層或者說最后一層在調(diào)用位置中起作用

缺點:1有時候隱式綁定的函數(shù)會丟失綁定對象罩旋;

? ? ? ? ? 2.調(diào)用回調(diào)函數(shù)的函數(shù)可能會修改this


丟失綁定對象


3.顯示綁定

call(...)和apply(...),第一個參數(shù)是對象啊央,給this準備的,接著在調(diào)用函數(shù)時將其綁定到this;兩者區(qū)別在第二個參數(shù)涨醋,call要求第二個參數(shù)必須一個一個傳入瓜饥,apply第二個參數(shù)以數(shù)組形式傳入;


call(...)綁定

bind(...)他會把你指定的參數(shù)設置為this的上下文浴骂,并調(diào)用原始函數(shù)


bind(...)綁定

缺點:1.會大大降低函數(shù)的靈活性乓土;

? ? ? ?2. 一旦綁定,不可在修改this的值

new綁定

使用new來調(diào)用函數(shù)(發(fā)生構造函數(shù))

1.創(chuàng)建(構造)一個全新的對象

2.這個新對象被執(zhí)行[[Prototype]]鏈接

3.這個新對象綁定到函數(shù)調(diào)用的this

4.如果函數(shù)沒有返回其他對象溯警,那么new表達式中的函數(shù)會自動返回這個新對象


new綁定

優(yōu)先級

默認綁定<隱式綁定<new綁定<顯示綁定

綁定例外

1.如果你把null或者undefined作為this的綁定對象傳入call趣苏,apply,bind梯轻,這些值在調(diào)用的時會被忽略食磕。實際應用是默認值

2.間接引用

3.軟綁定,給默認的綁定指定一個全局對象和undefined以為的值喳挑,那就可以實現(xiàn)和硬綁定相同的效果彬伦,同時保留或者顯示綁定修改的this的能力


間接引用

賦值表達式p.foo=b.foo的返回值是目標的引用,因此調(diào)用位置是foo而不是p.foo()或者o.foo()伊诵。簡而言之就是函數(shù)的調(diào)用位置決定单绑。

this語法

es6箭頭函數(shù)不使用this的四種標準規(guī)則,而是根據(jù)外層(函數(shù)或者全局)作用域來決定this曹宴。箭頭函數(shù)一單綁定搂橙。無法修改

小結

如果要判斷一個運行中函數(shù)的this綁定,就需要找到這個函數(shù)的直接調(diào)用位置笛坦。找到之后就可以按照下面四條規(guī)則來判斷this的綁定對象

1.由call区转,apply唯袄,bind調(diào)用?綁定到指定對象
2.new調(diào)用?綁定到新創(chuàng)建的對象
3.由上下文對象調(diào)用蜗帜?綁定到那個上下文對象
4.默認:嚴格模式下綁定到undefined恋拷,反之綁定到全局對象。


es6中的箭頭并不會使用四條標準的綁定規(guī)則厅缺。箭頭函數(shù)會繼承外層函數(shù)調(diào)用的this綁定蔬顾。箭頭函數(shù)一但綁定無法修改

函數(shù)在哪調(diào)用,this就綁定到該對象

參考資料《你不知道的JavaScript》

記得喜歡點喜歡喲湘捎,你的喜歡是我繼續(xù)的最大動力來源吶诀豁。

如果恰好你也是前端編程朋友,我們可以相互關注窥妇,相互學習舷胜,相約在前端

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市活翩,隨后出現(xiàn)的幾起案子烹骨,更是在濱河造成了極大的恐慌,老刑警劉巖材泄,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沮焕,死亡現(xiàn)場離奇詭異,居然都是意外死亡拉宗,警方通過查閱死者的電腦和手機峦树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旦事,“玉大人魁巩,你說我怎么就攤上這事〗愀。” “怎么了谷遂?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長单料。 經(jīng)常有香客問我埋凯,道長,這世上最難降的妖魔是什么扫尖? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任白对,我火速辦了婚禮,結果婚禮上换怖,老公的妹妹穿的比我還像新娘甩恼。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布条摸。 她就那樣靜靜地躺著悦污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钉蒲。 梳的紋絲不亂的頭發(fā)上切端,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音顷啼,去河邊找鬼踏枣。 笑死,一個胖子當著我的面吹牛钙蒙,可吹牛的內(nèi)容都是我干的茵瀑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼躬厌,長吁一口氣:“原來是場噩夢啊……” “哼马昨!你這毒婦竟也來了?” 一聲冷哼從身側響起扛施,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鸿捧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后煮嫌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笛谦,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抱虐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年昌阿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恳邀。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡懦冰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谣沸,到底是詐尸還是另有隱情刷钢,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布乳附,位于F島的核電站内地,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赋除。R本人自食惡果不足惜阱缓,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望举农。 院中可真熱鬧荆针,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玖媚,卻和暖如春箕肃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背今魔。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工突雪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涡贱。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓咏删,卻偏偏與公主長得像,于是被迫代替她去往敵國和親问词。 傳聞我的和親對象是個殘疾皇子督函,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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

  • 我們現(xiàn)在知道了每個函數(shù)的this是在運行的時候進行綁定的,完全取決于函數(shù)的調(diào)用位置激挪,也就是該函數(shù)的調(diào)用方法辰狡。 關于...
    FeRookie閱讀 1,042評論 0 5
  • 特別說明宛篇,為便于查閱,文章轉自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 689評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理薄湿,服務發(fā)現(xiàn)叫倍,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • this關鍵字是js中最最復雜的機制之一豺瘤。他被自動定義到所有函數(shù)的作用域中吆倦。 在學習這個關鍵字的過程中似乎也走了很...
    smartphp閱讀 1,016評論 7 19
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持蚕泽,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠桥嗤,并抽取幸運大...
    HetfieldJoe閱讀 6,925評論 15 54