JSinDeep1_探索执行环境_ES3.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JSinDeep1_探索执行环境_ES3.pdf

JSinDeep1:探索执行环境 (Execution Context)-ES3 篇 声明 JSinDeep 系列文章主要内容为作者对 ECMA-262 标准中一些概念的理解和探究,同时意 在帮助大家快速理解。本着严谨的态度,同时又需避免 API 式的枯燥细节罗列。文章会以适 当插图、例子去诠释概念,致力于通俗易懂。更具体、严谨、完整的描述建议阅读 ECMA262 文档。碍于作者水平有限,文中若有错误,欢迎大家批评指正。 *其它版本: English-Blog, English-PDF, Chinese-Blog, Chinese-PDF 概要 在我们写 JavaScript 代码时会定义一些变量、函数等。解释器在执行这些代码时是如 何处理并找到我们定义的这些数据的?在程序执行时,引用这些变量等操作的背后都发生了 什么?本文主要探讨ECMA-262-3标准中的执行环境(Execution Context)及与之相关的一些 内部机制和模型。 定义 当程序执行的控制权转移至 ECMAScript 可执行代码时,会进入到一个执行环境中 (Execution Context,缩写为 EC)。在一个EC 内也可能进入到一个新的EC,这些 EC 逻辑 上○1 会形成一个栈 (Stack)。 EC 是程序运行时动态创建的。例如:每一个函数在被调用时都会创建一个 EC,重复调 用函数 (包含递归调用的情形)会重新创建新的 EC,而后放置在逻辑栈中。逻辑栈会在程 序运行时随着新的函数调用、函数 return、未处理的异常抛出等情况动态变化,但逻辑栈 的最顶部总是当前正运行的 EC,它的最底部总是全局 EC (Global Context)。 图:运行时的逻辑EC 栈 1 ○这里的“逻辑上”是因 ECMA262 标准避免限制实现者的思路,具体实现在遵循标准的前提下不受其它限 制。因此这里所说的逻辑上的栈在具体实现时未必是通常意义上的栈。后面我们简称为:“逻辑栈”。 可执行代码的分类 由定义部分可知,“每一段可执行代码都有对应的 EC”,为方便按不同情况讨论,先 了解几种可执行代码的类型。 a). 全局代码 全局代码是指在任何被解析为函数体的代码以外的最外层的代码。 var i = 0; // 全局代码 function foo() { // foo 函数定义部分为全局代码 var j = 1; // foo 函数体内为函数代码 } var k = 2; // 全局代码 *字符串中的动态被 eval 执行的代码除外,在下一类 Eval 代码中介绍 在程序执行前会初始化全局 EC, 逻辑栈 (Logical Stack,简称为LS)的结构类似于: [伪代码] LS = { globalContext } b). 函数代码 函数代码是指函数体中的代码。某一个函数体内的函数代码并不包含其内联的其它函数 的函数体中的代码。 var i = 0; // 全局代码 function foo() { // 全局代码 var j = 0; // foo 的函数代码 function inner() { // foo 的函数代码 var k = 0; // inner 的函数代码 } if (i++ == 0) foo(); // foo 的函数代码,递归调用一次 foo } foo(); // 调用一次 foo 逻辑栈的结构类似于: [伪代码] LS = { // 第一次调用 foo foofunctionContext, // 当前激活的EC globalContext } LS = { // 第二次递归调用 foo foofunctionContextRecursively // 当前激活的EC foofunctionContext,

您可能关注的文档

文档评论(0)

wuyouwulu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档