下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >JavaScript 深入之执行上下文栈

JavaScript 深入之执行上下文栈

spring发布于 2017-07-06 11:55查看:759回复:1

     顺序执行?

        如果要问到JavaScript代码执行顺序的话,想必写过JavaScript的开发者都会有个直观的印象,那就是顺序执行,毕竟然而去看这段代码:

1499313163918718.jpg

        打印的结果却是两个foo2。

        刷过面试题的都知道这是因为JavaScript引擎并非一行一行地分析和执行程序,而是一段一段地分析执行。当执行一段代码的时候,会进行一个“准备工作”,比如第一个例子中的变量提升,和第二个例子中的函数提升。

        但是本文真正想让大家思考的是:这个”一段一段”中的“段”究竟是怎么划分的呢?

        到底JavaScript引擎遇到一段怎样的代码时才会做’准备工作’呢?

     可执行代码

        这就要说到JavaScript的可执行代码(executable code)的类型有哪些了?

        其实很简单,就三种,全局代码、函数代码、eval代码。

        举个例子,当执行到一个函数的时候,就会进行准备工作,这里的’准备工作’,让我们用个更专业一点的说法,就叫做”执行上下文(execution contexts)”。

     执行上下文栈

        接下来问题来了,我们写的函数多了去了,如何管理创建的那么多执行上下文呢?

        所以js引擎创建了执行上下文栈(Execution context stack,ECS)来管理执行上下文

        为了模拟执行上下文栈的行为,让我们定义执行上下文栈是一个数组:

1499313209486148.jpg

        试想当JavaScript开始要解释执行代码的时候,最先遇到的就是全局代码,所以初始化的时候首先就会向执行上下文栈压入一个全局执行上下文,让我们用globalContext表示它,并且只有当整个应用程序结束的时候,ECStack才会被清空,所以ECStack最底部永远有个globalContext:

1499313239824047.jpg

        现在JavaScript遇到下面的这段代码了:

1499313265478209.jpg

        当遇到函数执行的时候,就会创建一个执行上下文,并且压入执行上下文栈,当函数执行完毕的时候,就会将函数的执行上下文从栈中弹出。知道了这样的工作原理,让我们来看看如何处理上面这段代码:

1499313297427121.jpg

收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享
spring  于   2017-07-06 13:43 重新编辑过

版主推荐

    共有1条评论

    • IT宅男
    • mr jack
    • Mr ken
    • Mright
    • cappuccino
    • YUI
    • 课课家运营团队
    • 课课家技术团队1
    • 酸酸~甜甜
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: