`
zccst
  • 浏览: 3290396 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


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


执行上下文




如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics