关于javascript中的从客栈内存到实行上下文

关于javascript中的从客栈内存到实行上下文

我GitHub上的菜鸟堆栈地点: 点击跳转检察其他相干文章
文章在我的博客上的地点: 点击跳转

        先从计算机角度说一下内存:内存,包含三个部份:只读存储器(ROM)、随机存储器(RAM)和高速缓冲存储器(Cache)。

        而个中,高速缓冲存储器(Cache)又分为三种:一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)。

        当CPU须要数据的时刻,就会先找缓存,由于缓存最快,缓存找不到,才去找慢一点的内存,然后找到后继承将数据放入缓存,下次还要的时刻,照样先找缓存。

        简朴来讲,缓存中的数据只是内存的一部份,然则读写速率最快,所以CPU先找它。

        扯远了,回过头来。

        再诠释一下常说的“堆内存”、“栈内存”,“栈内存”也叫做“客栈内存”,不是两个一同的总称,现实上就是栈内存,所以我这里就分别说“堆内存”和“栈内存”。

        这内里就有“堆”和“栈”两个观点了。

        先说说栈,它是放在是在于一级缓存中的,数据被挪用的时刻放入存储空间中,然后被挪用完成时刻,就会被马上开释。

        再说堆,它是放在二级缓存中的,它的生命周期由虚拟机的渣滓接纳算法来决议。所以挪用这些对象的速率要相对来得低一些。

        举个很简朴的例子来诠释“堆”和“栈”这两个观点:

        栈,有点像汉诺塔那样的套圈圈,一圈一圈地放上去,前面放的都被压在了底部,背面的就压在上面,一层一层叠罗汉,然则取出来的时刻,就是背面放上去的先取出来,越早放进去的越后取出来,简朴来讲,就是迟来先登陆。

        堆,就像是一堆东西那些,就好像你芜杂的房间,一堆杂物,你想找东西,翻来翻去,找到了,能够拿走,有些东西,你不拿走,放在那边,实在就是渣滓。

        一般来讲,javascript中的数据类型分为基础数据类型和援用数据类型,而基础数据类型中的变量名和变量直接寄存在栈内存中,而援用数据类型的变量值现实上是寄存的一个地点指针,所以它的变量名和变量值也是寄存在栈内存中,而地点指向的现实内容,则是寄存在堆内存中。

        好了,最先说一下实行上下文了。

        有些人会殽杂实行上下文和作用域的观点,背面的文章我会说到作用域和作用域链,如今先说实行上下文。

        从实行上下文的生命周期来讲,包含三个部份:

        1、建立阶段;2、实行阶段;3、实行终了阶段。

        一、建立阶段

        实行上下文是在函数被挪用的时刻才建立,主要有三个内容:

        1、建立变量对象;2、初始化作用域链;3、肯定this的指向。

        二、实行阶段

        发生在函数代码实行阶段,主要有三个内容:

        1、变量赋值;2、函数援用;3、实行其他代码。

        三、实行终了阶段

        主要内容:实行终了后跳出实行上下文栈,守候被接纳。

        关于建立阶段和实行阶段的具体内容,能够人人会有迷惑,内里的具体内容背面文章会逐步细说。这里纯真说说实行上下文栈。

        举个简朴例子,函数内里也会有嵌套函数的状况,就像如许:

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

        既然实行上下文是函数被挪用的时刻建立的,那末上面这个father函数被挪用以后,然后son也被挪用了,那它们的实行上下文是什么关联呢?

        在这里,Javascript会应用实行上下文栈(Execution context stack,ECS)来治理实行上下文。

        追念一下前面栈内存的观点就很轻易明白。

        当挪用某个函数的时刻,就会建立实行上下文,并压入实行上下文栈中,当实行终了的时刻,就会从实行上下文栈中跳出,守候被接纳。像上面这类函数内嵌套函数的情况,挪用father函数的时刻,father建立的实行上下文压入栈中,然后最先实行father的函数体内代码,由于father函数还没实行终了,所以挪用son函数时刻会将son建立的实行上下文压入栈中,当son实行终了,就会跳出,然后father实行终了,继承跳出。这就完成了全部father的实行上下文周期。

        照样那句,迟来先登陆的觉得。就好像下面的图如许(图片援用自收集),下面就是一个实行上下文栈,最底层肯定是全局了,然后只需函数没实行终了继承在函数内挪用别的函数的话,别的函数的实行上下文就会接着压上去,末了实行终了,压在最上面的上下文先清出,然后别的实行上下文又变成最上面的了,然后实行终了,继承清出,就和图那样了。

        现实状况能够不是图的那样简朴,能够清出到EC2那一层的时刻,还没实行完这个函数,又挪用别的函数,别的的实行上下文又接着压上去了。

        固然,原理都是一样的。
《关于javascript中的从客栈内存到实行上下文》

    原文作者:ershing
    原文地址: https://segmentfault.com/a/1190000010316875
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞