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运行时系统如何真正地管理代码执行的。


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


    执行上下文

  • 相关阅读:
    选择器
    asp.net 操作ftp类
    女装类视觉设计感悟
    跨域读取js变色
    关于jQuery的ajax初级应用
    打造前端自动化编译环境(思路)
    <base>标签在ie6下的问题
    通过压缩图片 来提升页面加载速度
    原来我一直不懂cookie
    去处浏览器的默认效果(autocomplete, outline)
  • 原文地址:https://www.cnblogs.com/shsgl/p/4289917.html
Copyright © 2011-2022 走看看