摘要:寫這篇文章之前是看了這篇文章講關(guān)于箭頭函數(shù)中指向的問題,于是借此把相關(guān)的函數(shù),構(gòu)造函數(shù),,,箭頭函數(shù)的一些概念結(jié)合自己的理解又理了一遍,想著好好復(fù)習一下,最后有了寫這篇文章的想法。這個上下文棧就是執(zhí)行程序的基礎(chǔ)。
寫這篇文章之前是看了這篇文章講關(guān)于箭頭函數(shù)中this指向的問題,于是借此把相關(guān)的函數(shù),構(gòu)造函數(shù),new,this,箭頭函數(shù)的一些概念結(jié)合自己的理解又理了一遍,想著好好復(fù)習一下,最后有了寫這篇文章的想法。我不太喜歡說一些太專業(yè)的話(自己菜,沒法專業(yè)),所以都是自己理解以及自己總結(jié)最后得出的結(jié)論,首先看下下面這四個控制臺的輸出結(jié)果:
1. var a = 11 function test () { this.a = 22 let b = function () { consolve.log(this.a) } b() } var x = new test() => 11 x.a => 22 2. var a = 11 function test () { this.a = 22 let b = function () { consolve.log(this.a) } b() } var x = test() => 22 x.a => Uncaught TypeError: Cannot read property "a" of undefined 3. var a = 11 function test () { this.a = 22 let b = () => { consolve.log(this.a) } b() } var x = new test() => 22 x.a => 22 4. var a = 11 function test () { this.a = 22 let b = () => { consolve.log(a) } b() } var x = new test() => 11 x.a => 22
如果你耐心得看完了這四段,并且你所想的結(jié)果就是控制臺的結(jié)果,那接下去你就可以不用看了,因為我要講的你應(yīng)該都懂,不過如果你有某段不明白,或者大部分不清楚,那下面的內(nèi)容還是很值得看看并且理解理解的,畢竟這些真的蠻重要。
首先提幾個概念:執(zhí)行上下文(執(zhí)行環(huán)境):當JavaScript代碼執(zhí)行的時候,會進入不同的執(zhí)行上下文,這些執(zhí)行上下文會構(gòu)成了一個執(zhí)行上下文棧(Execution context stack,ECS)。這個上下文棧就是js執(zhí)行程序的基礎(chǔ)。
this: 它是動態(tài)的,有人稱它為動態(tài)上下文,我覺得不太對,this指向一個環(huán)境對象(代表這個執(zhí)行環(huán)境),這是一個對象,而且是一個普通對象,而不是指向一個執(zhí)行環(huán)境。
以下是我自己結(jié)合上面的內(nèi)容的總結(jié):函數(shù)(function): 函數(shù)它自己就是一個對象,它用來裝一些等著執(zhí)行的代碼,像層殼一樣,你不用它,它里面的代碼是不會執(zhí)行的,它身上綁著this(所以函數(shù)有自己的執(zhí)行環(huán)境)。
new : 用到new說明有函數(shù)被當作構(gòu)造函數(shù)來調(diào)用了。new會返回一個對象,像這里var x = new test()的變量x就指向這個返回出來的對象,new在返回對象之前會把函數(shù)殼里面的代碼拿出來執(zhí)行一遍,但是,此時殼被剝?nèi)チ耍瑯?gòu)造函數(shù)里面的函數(shù)執(zhí)行環(huán)境自然就變了,就像這里的:
let b = () => { consolve.log(this.a) } b()
自然b()暴露給了這會兒在外面的執(zhí)行環(huán)境(控制臺的話是window),但是構(gòu)造函數(shù)會將自己的this給它創(chuàng)建出來的對象(也可以說給出的this成了這個對象),于是this.a = 22,a這個屬性被掛到了新建的對象上。
最后專業(yè)點的話可以這樣模擬一下new做的一系列操作(這樣就扯到原型鏈繼承的東西了這里暫時不需要管):
new Animal("cat") = { var obj = {}; // 新建一個對象 obj.__proto__ = Animal.prototype; // 實現(xiàn)原型鏈 var result = Animal.call(obj,"cat"); // 用call給this return typeof result === "object"? result : obj; }
箭頭函數(shù):這個es6出來的,現(xiàn)在運用廣泛的東西跟函數(shù)有點不太一樣,我這里只討論一點,就是它自己身上根本沒綁著this。所以在它里面調(diào)用this需要往父級去找,也就是它的this是繼承自父執(zhí)行環(huán)境的,而不是像有些人對其的解釋,它的this一開始就固定了。也正是因為它沒有this,所以也就不能用作構(gòu)造函數(shù),也就沒法new。雖然最后結(jié)果是對的,但解釋不太對。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88824.html
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗和總結(jié),無可厚非,但是決定了就一定要堅定的走下去,謹慎是為了更好的堅持,而不是放棄的理由。寫在前面這里前后端指的是開發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗和總結(jié),無可厚非,但是決定了就一定要堅定的走下去,謹慎是為了更好的堅持,而不是放棄的理由。寫在前面:這里前后端指的是web開發(fā)的前后端。1、前端崗位需...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗和總結(jié),無可厚非,但是決定了就一定要堅定的走下去,謹慎是為了更好的堅持,而不是放棄的理由。寫在前面這里前后端指的是開發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗和總結(jié),無可厚非,但是決定了就一定要堅定的走下去,謹慎是為了更好的堅持,而不是放棄的理由。寫在前面:這里前后端指的是web開發(fā)的前后端。1、前端崗位需...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗和總結(jié),無可厚非,但是決定了就一定要堅定的走下去,謹慎是為了更好的堅持,而不是放棄的理由。寫在前面這里前后端指的是開發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗和總結(jié),無可厚非,但是決定了就一定要堅定的走下去,謹慎是為了更好的堅持,而不是放棄的理由。寫在前面:這里前后端指的是web開發(fā)的前后端。1、前端崗位需...
摘要:因為網(wǎng)站建設(shè)一般項目比較小,我一個人是可以完成前后端開發(fā)的,如果做成成品當然得加上小蘇設(shè)計師。關(guān)鍵詞選擇因為面向的是單個城市業(yè)務(wù),在城市選擇上猶豫了不少時間,首先得是一個大城市,客戶量足,當時我在北京,小蘇是在一個省會城市。 我技術(shù)之外的資本是零,如果你也是這樣,那這篇文章適合你! 這是我的故事之一,希望對你有啟發(fā)。如果你每天下班后就是躺在床上刷刷斗音,看看微博。但是又總想擺脫黑暗迷亂...
閱讀 1004·2023-04-25 19:35
閱讀 2665·2021-11-22 09:34
閱讀 3693·2021-10-09 09:44
閱讀 1726·2021-09-22 15:25
閱讀 2941·2019-08-29 14:00
閱讀 3377·2019-08-29 11:01
閱讀 2603·2019-08-26 13:26
閱讀 1740·2019-08-23 18:08