摘要:前言中的重中之重,也是在面試中被問得最多的問題,在這里到底是什么我也時(shí)常疑惑于此,特用此文來整理思路理解并方便日后回顧。是什么看調(diào)用并轉(zhuǎn)換例子是看調(diào)用,是全局定義函數(shù),掛載在對(duì)象上,所以是。
前言
JS中的重中之重,也是在面試中被問得最多的問題,在這里this到底是什么?我也時(shí)常疑惑于此,特用此文來整理思路理解并方便日后回顧。
函數(shù)的調(diào)用JS(ES5)里面有三種函數(shù)調(diào)用形式:
func(p1, p2) //等價(jià)于func.call(undefined, p1, p2) obj.child.method(p1, p2) //等價(jià)于obj.child.method.call(obj.child, p1, p2) func.call(context, p1, p2)
把所有的調(diào)用轉(zhuǎn)換成call的形式后,this指的就是call后面的第一個(gè)參數(shù)。
特別注意,全局定義的函數(shù)轉(zhuǎn)換成call的形式后,雖然第一個(gè)參數(shù)為undefined,但是由于全局定義的函數(shù)都是掛載到window/global對(duì)象上的,所以this會(huì)指向window/global。
看調(diào)用并轉(zhuǎn)換
例子1
function showName(){ console.log(this); //this是window } showName();//showName.call(undefined)
看調(diào)用,showName是全局定義函數(shù),掛載在window對(duì)象上,所以this是window。
例子2
var name="hello window!"; function testName () { var name="hello this!"; console.log(this.name); } testName();//testName.call(undefined)
為什么log出來的不是"hello this!"而是"hello window!"呢?
同樣,testName也是掛載在window上的,所以testName函數(shù)在調(diào)用時(shí)this是window,
所以打出來的自然是window.name,也就是全局變量name的值"hello window!"而不是"hello this!"。
例子3
var obj={ a:"哈哈哈", b:function(){ var a="嘿嘿嘿"; console.log(this.a);//"哈哈哈" } }; obj.b();//obj.b.call(obj)
那么以上代碼為什么會(huì)打出"哈哈哈"呢?
顯然,這里的this是指obj,也就是會(huì)去找obj.a,所以打出的就是"哈哈哈"啦。
fn() this=>window/global obj.fn() this=>obj fn.call(xxx) this=>xxx fn.apply(xxx) this=>xxx fn.bind(xxx) this=>xxx new Fn() this=>新的對(duì)象 fn = () =>{} this=>外面的this
方法:
1.看源碼中對(duì)應(yīng)的函數(shù)是怎么被 call 的(這是最靠譜的辦法)
2.看文檔
3.console.log(this)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106562.html
摘要:據(jù)預(yù)測(cè),到年,大多數(shù)的企業(yè)應(yīng)用將被遷移到云中。在云計(jì)算的霧期更需要對(duì)云計(jì)算產(chǎn)業(yè)有一個(gè)清醒的認(rèn)識(shí),不要在最后隨著霧散去自己也隨霧而去。 從概念開始逐漸轉(zhuǎn)為應(yīng)用落地,各企業(yè)紛紛加入到云計(jì)算浪潮,國(guó)家也在大力扶植云計(jì)算產(chǎn)業(yè)。據(jù)預(yù)測(cè),到2020年,大多數(shù)的企業(yè)應(yīng)用將被遷移到云中。與此同時(shí),越來越多的應(yīng)用開發(fā)商也將把應(yīng)用開發(fā)、測(cè)試平臺(tái)遷移到云中?! <冶硎?,以云計(jì)算為代表的新型計(jì)算機(jī)模式未來將成...
摘要:本文是對(duì)加深對(duì)的理解一文的導(dǎo)圖版翻譯中的是一個(gè)捉摸不透的東西,它很喜歡變化,很詭異。寫在后面的幾種綁定規(guī)則,歸根結(jié)底,的套路就是關(guān)于幾種模式的等價(jià)變換形式,知乎上面有大神解答,猛戳這最后是全圖附上思維導(dǎo)圖的下載鏈接去有道云筆記下載 本文是對(duì)《加深對(duì) JavaScript This 的理解》一文的導(dǎo)圖版翻譯 JS中的this是一個(gè)捉摸不透的東西,它很喜歡變化,很詭異。擁抱變化,接收詭異...
摘要:實(shí)例對(duì)象與構(gòu)造函數(shù)的原型聯(lián)系是在創(chuàng)建實(shí)例時(shí)確定的,當(dāng)創(chuàng)建后更改原型對(duì)象并不改變之前創(chuàng)建的實(shí)例所關(guān)聯(lián)的原型對(duì)象,新創(chuàng)建的使用新的原型對(duì)象。 再記面向?qū)ο?函數(shù)和對(duì)象的聯(lián)系 先理一下函數(shù)的功能: 創(chuàng)建:可以通過字面量創(chuàng)建 可以賦值給變量、數(shù)組作為成員和其他的對(duì)象作為屬性 作為函數(shù)的參數(shù) 作為返回值 自身可以添加屬性 在上面列出的函數(shù)功能對(duì)象皆具有 詳細(xì)函數(shù)介紹 為什么介紹函數(shù)? 因?yàn)殚]...
摘要:的關(guān)鍵字總是讓人捉摸不透,關(guān)鍵字代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,因?yàn)楹瘮?shù)的調(diào)用場(chǎng)景不同,的指向也不同。其實(shí)只要理解語言的特性就很好理解。個(gè)人對(duì)中的關(guān)鍵字的理解如上,如有不正,望指正,謝謝。 javascript的this關(guān)鍵字總是讓人捉摸不透,this關(guān)鍵字代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,因?yàn)楹瘮?shù)的調(diào)用場(chǎng)景不同,this的指向也不...
摘要:原文函數(shù)的純潔性純函數(shù)非純函數(shù)副作用純函數(shù)一個(gè)函數(shù)返回的值只取決于他輸入的值,并且沒有副作用,那這個(gè)函數(shù)就是純函數(shù)。因此,純函數(shù)無法對(duì)它的父作用域作出任何修改。更多關(guān)于函數(shù)純潔性的資料 原文:Glossary of Modern JavaScript Concepts: Part 1 函數(shù)的純潔性:純函數(shù)、非純函數(shù)、副作用 純函數(shù) 一個(gè)函數(shù)返回的值只取決于他輸入的值,并且沒有副作用,那...
閱讀 1217·2021-11-24 09:38
閱讀 2621·2021-09-27 14:00
閱讀 1183·2019-08-30 15:55
閱讀 1360·2019-08-30 14:16
閱讀 1508·2019-08-30 10:54
閱讀 2890·2019-08-28 17:58
閱讀 772·2019-08-26 13:22
閱讀 1252·2019-08-26 12:01