成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

關(guān)于javascript中的從堆棧內(nèi)存到執(zhí)行上下文

KitorinZero / 1322人閱讀

摘要:從執(zhí)行上下文的生命周期來(lái)說(shuō),包括三個(gè)部分創(chuàng)建階段執(zhí)行階段執(zhí)行完畢階段。三執(zhí)行完畢階段主要內(nèi)容執(zhí)行完畢后跳出執(zhí)行上下文棧,等待被回收。這就完成了整個(gè)的執(zhí)行上下文周期。

關(guān)于javascript中的從堆棧內(nèi)存到執(zhí)行上下文
我GitHub上的菜鳥(niǎo)倉(cāng)庫(kù)地址: 點(diǎn)擊跳轉(zhuǎn)查看其他相關(guān)文章
文章在我的博客上的地址: 點(diǎn)擊跳轉(zhuǎn)

? ? ? ? 先從計(jì)算機(jī)角度說(shuō)一下內(nèi)存:內(nèi)存,包括三個(gè)部分:只讀存儲(chǔ)器(ROM)、隨機(jī)存儲(chǔ)器(RAM)和高速緩沖存儲(chǔ)器(Cache)。

? ? ? ? 而其中,高速緩沖存儲(chǔ)器(Cache)又分為三種:一級(jí)緩存(L1 Cache)、二級(jí)緩存(L2 Cache)、三級(jí)緩存(L3 Cache)。

? ? ? ? 當(dāng)CPU需要數(shù)據(jù)的時(shí)候,就會(huì)先找緩存,因?yàn)榫彺孀羁?,緩存找不到,才去找慢一點(diǎn)的內(nèi)存,然后找到后繼續(xù)將數(shù)據(jù)放入緩存,下次還要的時(shí)候,還是先找緩存。

? ? ? ? 簡(jiǎn)單來(lái)說(shuō),緩存中的數(shù)據(jù)只是內(nèi)存的一部分,但是讀寫(xiě)速度最快,所以CPU先找它。

? ? ? ? 扯遠(yuǎn)了,回過(guò)頭來(lái)。

? ? ? ? 再解釋一下常說(shuō)的“堆內(nèi)存”、“棧內(nèi)存”,“棧內(nèi)存”也叫做“堆棧內(nèi)存”,不是兩個(gè)一起的總稱(chēng),實(shí)際上就是棧內(nèi)存,所以我這里就分別說(shuō)“堆內(nèi)存”和“棧內(nèi)存”。

? ? ? ? 這里面就有“堆”和“?!眱蓚€(gè)概念了。

? ? ? ? 先說(shuō)說(shuō)棧,它是放在是在于一級(jí)緩存中的,數(shù)據(jù)被調(diào)用的時(shí)候放入存儲(chǔ)空間中,然后被調(diào)用完成時(shí)候,就會(huì)被立刻釋放。

? ? ? ? 再說(shuō)堆,它是放在二級(jí)緩存中的,它的生命周期由虛擬機(jī)的垃圾回收算法來(lái)決定。所以調(diào)用這些對(duì)象的速度要相對(duì)來(lái)得低一些。

? ? ? ? 舉個(gè)很簡(jiǎn)單的例子來(lái)解釋“堆”和“?!边@兩個(gè)概念:

? ? ? ? 棧,有點(diǎn)像漢諾塔那樣的套圈圈,一圈一圈地放上去,前面放的都被壓在了底部,后面的就壓在上面,一層一層疊羅漢,但是取出來(lái)的時(shí)候,就是后面放上去的先取出來(lái),越早放進(jìn)去的越后取出來(lái),簡(jiǎn)單來(lái)說(shuō),就是遲來(lái)先上岸。

? ? ? ? 堆,就像是一堆東西那些,就好像你雜亂的房間,一堆雜物,你想找東西,翻來(lái)翻去,找到了,可以拿走,有些東西,你不拿走,放在那里,其實(shí)就是垃圾。

? ? ? ? 一般來(lái)說(shuō),javascript中的數(shù)據(jù)類(lèi)型分為基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型,而基本數(shù)據(jù)類(lèi)型中的變量名和變量直接存放在棧內(nèi)存中,而引用數(shù)據(jù)類(lèi)型的變量值實(shí)際上是存放的一個(gè)地址指針,所以它的變量名和變量值也是存放在棧內(nèi)存中,而地址指向的實(shí)際內(nèi)容,則是存放在堆內(nèi)存中。

? ? ? ? 好了,開(kāi)始說(shuō)一下執(zhí)行上下文了。

? ? ? ? 有些人會(huì)混淆執(zhí)行上下文和作用域的概念,后面的文章我會(huì)說(shuō)到作用域和作用域鏈,現(xiàn)在先說(shuō)執(zhí)行上下文。

? ? ? ? 從執(zhí)行上下文的生命周期來(lái)說(shuō),包括三個(gè)部分:

? ? ? ? 1、創(chuàng)建階段;2、執(zhí)行階段;3、執(zhí)行完畢階段。

? ? ? ? 一、創(chuàng)建階段

? ? ? ? 執(zhí)行上下文是在函數(shù)被調(diào)用的時(shí)候才創(chuàng)建,主要有三個(gè)內(nèi)容:

? ? ? ? 1、創(chuàng)建變量對(duì)象;2、初始化作用域鏈;3、確定this的指向。

? ? ? ? 二、執(zhí)行階段

? ? ? ? 發(fā)生在函數(shù)代碼執(zhí)行階段,主要有三個(gè)內(nèi)容:

? ? ? ? 1、變量賦值;2、函數(shù)引用;3、執(zhí)行其他代碼。

? ? ? ? 三、執(zhí)行完畢階段

? ? ? ? 主要內(nèi)容:執(zhí)行完畢后跳出執(zhí)行上下文棧,等待被回收。

? ? ? ? 關(guān)于創(chuàng)建階段和執(zhí)行階段的具體內(nèi)容,可能大家會(huì)有疑惑,里面的具體內(nèi)容后面文章會(huì)慢慢細(xì)說(shuō)。這里單純說(shuō)說(shuō)執(zhí)行上下文棧。

? ? ? ? 舉個(gè)簡(jiǎn)單例子,函數(shù)里面也會(huì)有嵌套函數(shù)的情況,就像這樣:

//函數(shù)father
function father(age){
    var me = age + 20;
    //函數(shù)son
    function son(age){
        return age;
    }
    return son(me);
}
father(33);

? ? ? ? 既然執(zhí)行上下文是函數(shù)被調(diào)用的時(shí)候創(chuàng)建的,那么上面這個(gè)father函數(shù)被調(diào)用之后,然后son也被調(diào)用了,那它們的執(zhí)行上下文是什么關(guān)系呢?

? ? ? ? 在這里,Javascript會(huì)利用執(zhí)行上下文棧(Execution context stack,ECS)來(lái)管理執(zhí)行上下文。

? ? ? ? 回想一下前面棧內(nèi)存的概念就很容易理解。

? ? ? ? 當(dāng)調(diào)用某個(gè)函數(shù)的時(shí)候,就會(huì)創(chuàng)建執(zhí)行上下文,并壓入執(zhí)行上下文棧中,當(dāng)執(zhí)行完畢的時(shí)候,就會(huì)從執(zhí)行上下文棧中跳出,等待被回收。像上面這種函數(shù)內(nèi)嵌套函數(shù)的情形,調(diào)用father函數(shù)的時(shí)候,father創(chuàng)建的執(zhí)行上下文壓入棧中,然后開(kāi)始執(zhí)行father的函數(shù)體內(nèi)代碼,因?yàn)閒ather函數(shù)還沒(méi)執(zhí)行完畢,所以調(diào)用son函數(shù)時(shí)候會(huì)將son創(chuàng)建的執(zhí)行上下文壓入棧中,當(dāng)son執(zhí)行完畢,就會(huì)跳出,然后father執(zhí)行完畢,繼續(xù)跳出。這就完成了整個(gè)father的執(zhí)行上下文周期。

? ? ? ? 還是那句,遲來(lái)先上岸的感覺(jué)。就好像下面的圖這樣(圖片引用自網(wǎng)絡(luò)),下面就是一個(gè)執(zhí)行上下文棧,最底層肯定是全局了,然后只要函數(shù)沒(méi)執(zhí)行完畢繼續(xù)在函數(shù)內(nèi)調(diào)用其它函數(shù)的話,其它函數(shù)的執(zhí)行上下文就會(huì)接著壓上去,最后執(zhí)行完畢,壓在最上面的上下文先清出,然后其它執(zhí)行上下文又變成最上面的了,然后執(zhí)行完畢,繼續(xù)清出,就和圖那樣了。

? ? ? ? 實(shí)際情況可能不是圖的那樣簡(jiǎn)單,可能清出到EC2那一層的時(shí)候,還沒(méi)執(zhí)行完這個(gè)函數(shù),又調(diào)用其它函數(shù),其它的執(zhí)行上下文又接著壓上去了。

? ? ? ? 當(dāng)然,道理都是一樣的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84272.html

相關(guān)文章

  • 關(guān)于javascript中的作用域和作用域鏈

    摘要:作用域的類(lèi)別可以影響到變量的取值,分為詞法作用域靜態(tài)作用域和動(dòng)態(tài)作用域。而,采用的就是詞法作用域,或者叫靜態(tài)作用域。 關(guān)于javascript中的作用域和作用域鏈 我GitHub上的菜鳥(niǎo)倉(cāng)庫(kù)地址: 點(diǎn)擊跳轉(zhuǎn)查看其他相關(guān)文章 文章在我的博客上的地址: 點(diǎn)擊跳轉(zhuǎn) ? ? ? ? 前面的文章說(shuō)到, 執(zhí)行上下文的創(chuàng)建階段,主要有三個(gè)內(nèi)容: ? ? ? ? 1、創(chuàng)建變量對(duì)象;2、初始化作用域...

    lcodecorex 評(píng)論0 收藏0
  • 【譯】JavaScript中的執(zhí)行下文堆棧是什么?

    摘要:每次調(diào)用函數(shù)時(shí),都會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文。理解執(zhí)行上下文和堆??梢宰屇私獯a為什么要計(jì)算您最初沒(méi)有預(yù)料到的不同值的原因。 首發(fā):https://www.love85g.com/?p=1723 在這篇文章中,我將深入研究JavaScript最基本的部分之一,即執(zhí)行上下文。在這篇文章的最后,您應(yīng)該更清楚地了解解釋器要做什么,為什么在聲明一些函數(shù)/變量之前可以使用它們,以及它們的值是如何...

    miguel.jiang 評(píng)論0 收藏0
  • JavaScript中的執(zhí)行下文

    摘要:如果在全局代碼中調(diào)用函數(shù),程序的順序流進(jìn)入被調(diào)用的函數(shù),創(chuàng)建新的執(zhí)行上下文并將其推送到執(zhí)行堆棧的頂部。每次調(diào)用函數(shù)時(shí),都會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文。 翻譯:瘋狂的技術(shù)宅鏈接:http://davidshariff.com/blog/... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 在這篇文章中,我將深入探討JavaScript的最...

    cfanr 評(píng)論0 收藏0
  • 關(guān)于javascript基礎(chǔ)的認(rèn)識(shí)

    摘要:下面所有的東西都不為堆高我的編程能力,所以我只是把對(duì)的認(rèn)識(shí)用最粗鄙的語(yǔ)言進(jìn)行講解和記錄,所以,閱讀需謹(jǐn)慎執(zhí)行在執(zhí)行之前會(huì)先進(jìn)行編譯。所以對(duì)純前端尤其值得一提,不僅要知道怎么進(jìn)行數(shù)據(jù)類(lèi)型的轉(zhuǎn)換更要清楚的知道你當(dāng)下在操作的是什么數(shù)據(jù)類(lèi)型。 下面所有的東西都不為堆高我的編程能力,所以我只是把對(duì)JS的認(rèn)識(shí)用最粗鄙的語(yǔ)言進(jìn)行講解和記錄,所以,閱讀需謹(jǐn)慎! JS執(zhí)行 JS在執(zhí)行之前會(huì)先進(jìn)行編譯...

    microelec 評(píng)論0 收藏0
  • 【進(jìn)階1-3期】JavaScript深入之內(nèi)存空間詳細(xì)圖解

    摘要:進(jìn)階期理解中的執(zhí)行上下文和執(zhí)行棧進(jìn)階期深入之執(zhí)行上下文棧和變量對(duì)象但是今天補(bǔ)充一個(gè)知識(shí)點(diǎn)某些情況下,調(diào)用堆棧中函數(shù)調(diào)用的數(shù)量超出了調(diào)用堆棧的實(shí)際大小,瀏覽器會(huì)拋出一個(gè)錯(cuò)誤終止運(yùn)行。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第3天。 本計(jì)劃一共28期,每期重點(diǎn)攻...

    coordinate35 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<