zoukankan      html  css  js  c++  java
  • [夏天Object]运行时程序执行的上下文堆栈(一)

    作者:zccst

    时间:2014-07-01

    这已经是第二次系统学习面向对象,时至今日,我仍对Javascript的面向对象编程常读常新,所以还得继续学习。

    原以为读完《Javascript高级程序设计》,就彻底理解Javascript了,就到顶了,谁知实际上是才刚刚开始,后面的路还很漫长。我知道我还需要读更多的Javascript书籍或技术,才能真正更深入理解Javascript编程。


    构造函数,对象,原型对象是什么,以及三者之间的关系,以及与Function.prototype,Object.prototype之间的关系已记录在另一个文档中,详情可参考:
    http://zccst.iteye.com/blog/1997469

    今天再重点说一下运行时程序执行的上下文堆栈:

    三类:
    1,全局代码
    2,函数代码(局部代码)
    3,eval代码
    每一类求值都在其执行上下文中进行

    注意,一个函数可能会创造无数的上下文,因为对函数的每次调用(即使这个函数递归的调用自己)都会生产一个具有新状态的上下文:
    function foo(bar){}
    foo(10);
    foo(20);
    foo(30);
    一个执行上下文可能会触发另一个上下文,比如一个函数调用另一个函数(或者在全局上下文中调用一个全局函数),等等。从逻辑上来说,这是以栈的形式实现的,他叫做执行上下文栈。

    一个触发了其他上下文的上下文叫caller。被触发的上下文叫做callee。
    callee在同一时间可能是一些其他callee的caller(比如,一个全局上下文中被调用的函数,之后调用了一些内部函数)。

    当一个caller触发(调用)了一个callee,这个caller会暂缓自身的执行,然后把控制器传递给callee。这个callee被 push到栈中,并成为一个运行中(活动的)执行上下文。在callee的上下文结束后,他会把控制权返回给caller,然后caller的上下文继续 执行(他可能触发其他上下文)直到它结束,以此类推。
    callee可能简单的返回或者由于异常退出。一个抛出的但是没有被捕获的异常可能退出(从栈中pop)一个或者多个上下文。
    换句话说,所有程序的运行时可以用执行上下文(EC)栈来表示,栈顶是当前活跃(active)上下文:


    当程序开始的时候他会进入全局执行上下文,此上下文位于栈底并且是栈中的第一个元素。然后全局代码进行一些初始化,创建需要的对象和函数。在全局 上下文的执行过程中,他的代码可能触发其他(意见创建完成的)函数,这些函数将会进入他们自己的执行上下文,想栈中push新的元素,以此类推。当初始化 完成之后,运行时系统(runtime system)就会等待一些时间(比如,用户鼠标点击),这些时间将会触发一些函数,从而进入新的执行上下文中。

    在下图中,拥有一些函数上下文EC1和全局上下文Global EC,当EC1进入和退出全局上下文的时候下面的栈将会发生变化:

    这就是JS运行时系统如何真正地管理代码执行的。


    像我们所说的,栈中的每个执行上下文都可以用一个对象来表示。让我们看看他的结构以及一个上下文到底需要什么状态(什么属性)来执行他的代码。


    执行上下文

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/shsgl/p/4289917.html
Copyright © 2011-2022 走看看