js进栈出栈(入栈和出栈的过程)

图片授权基于 www.pixabay.com 相关协议
若想解释清楚入栈和出栈,就要先理解「函数调用」「函数执行上下文」「全局执行上下文」。

首先说函数调用,函数是如何被调用的?

函数在声明的时候其实就是在声明一个变量。例如:

    function webFn(){    return \\\'Hello Word\\\'}

    上面这段代码在浏览器引擎解析时是这样的:

      webFn = function(){    return \\\'Hello Word\\\'}

      Function 关键字后面跟的「webFn」其实是一个变量名。在词法分析的时候就会定义 webFn 这个变量,而调用这个函数的方法是用 () 一对括号来调用,一个简单的函数就这样执行了。

      函数上下文和全局上下文

      上下文的意思就是:当前的执行环境。我们知道了怎样调用函数,那函数是如何被引擎处理的呢?首先我们知道 JavaScript 的执行顺序是从上往下依次执行。

        let a1 = 1;function webFn(){    let a2 = 2;    return a1 + a2;}webFn();

        这段代码一共 6 行,我们来分析这段代码的执行顺序。首先创建「全局上下文」,全局环境入栈。

        js进栈出栈(入栈和出栈的过程)

        执行到第 2 行的时候是一个函数,先声明,但不处理:

        js进栈出栈(入栈和出栈的过程)

        随后直接执行第 6 行,调用 webFn() 来创建一个新的上下文环境「函数执行上下文」。在内部是这样执行的:

        js进栈出栈(入栈和出栈的过程)

        初始的时候呢,只存在一个全局执行上下文,当你调用函数后,就出现了该函数执行上下文。指针是一直都在最顶栈的,所以会先执行最顶栈的代码。

        入栈和出栈是什么意思

        知道了上下文的关系,就容易理解出入栈的规矩了。栈嘛,先入后出。先执行全局环境,全局环境先入栈,随后又调用了函数,那函数也入栈了。如果函数内还有其他函数,那就会继续入栈。

        js进栈出栈(入栈和出栈的过程)

        那出栈的时候呢,JavaScript 是从上向下执行的,后进去的函数先出去,从栈顶到栈底的执行顺序。当前栈位置是由「指针」决定的,执行完当前函数,出栈销毁当前上下文环境后,指针会自动向下移动。「闭包除外,虽然指针移动,但变量不销毁」

        js进栈出栈(入栈和出栈的过程)

        什么是栈溢出?

        如果代码中含有无限递归方法,就会一直有方法入栈,无限循环下去就导致了栈溢出,说白了就是栈太多,处理不过来了。

        亲手体验一下栈的状态

        Chrome 出入栈效果

        内容和图片来源于:极客时间《浏览器工作原理与实践》

        原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34539.html

        (0)
        小道研究的头像小道研究
        上一篇 2024年4月8日
        下一篇 2024年4月8日

        相关推荐

        发表回复

        您的电子邮箱地址不会被公开。 必填项已用 * 标注