JAVASCRIPT内部原理.pdf

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JAVASCRIPT内部原理

1. 执行上下文 概要 本文将向大家介绍ECMAScript 的执行上下文以及相关的可执行代码类型。 定义 每当控制器到达ECMAScript 可执行代码的时候,控制器就进入了一个执行上下文。 执行上下文(简称:EC)是个抽象的概念,ECMA-262 标准中用它来区分不同类型的可执行代码。 标准中并没有从技术实现的角度来定义执行上下文的具体结构和类型;这是实现标准的ECMAScript 引擎所要考虑的问题。 一系列活动的执行上下文从逻辑上形成一个栈。栈底总是全局上下文,栈顶是当前 (活动的)执行上下文。当在不同的执行上下文间切换(退出的而进入新的执行上下文)的 时候,栈会被修改(通过压栈或者退栈的形式)。 可执行代码类型 可执行代码类型和执行上下文相关。有的时候,当提到代码类型的时候,其实就是在说执行上下文。 举个例子,我们将执行上下文的栈以数组的形式来表示: ECStask = [ ]; 每次控制器进入一个函数(哪怕该函数被递归调用或者作为构造器),都会发生压栈的操作。内置eval 函数工作的时候也不例外。 全局代码 这类代码是在“程序”级别上被处理的:比如,加载一个外部的js 文件或者内联的js 代码(被包含在script/script标签内)。全局代码不包含任何函数体内的代码。 在初始化的时候(程序开始),ECStack 如下所示: ECStack = [ globalContext ]; 函数代码 一旦控制器进入函数代码(各类函数),就会有新的元素会被压栈到ECStack。要注意的是:实体函数代码并不包括内部函数的代码。如下所示,我们调用一个函数,该函 数递归调用自己一次: ( foo(bar){ function if (bar){ return ; } foo( ); true })(); 之后,ECStack 就被修改成如下所示: //首先激活foo函数 ECStack = [ functionContext globalContext ]; //递归激活 foo函数 ECStack = [ functionContext - recursively functionContext globalContext ]; 每次函数返回,退出当前活动的执行上下文时,ECStack 就会被执行对应的退栈操作——先进后出——和传统的栈实现一致。同样的,当抛出未捕获的异常时,也会退出一 个或者多个执行上下文,ECStack 也会做相应的退栈操作。待这些代码完成之后,ECStack 中就只剩下一个执行上下文(globalContext)——直到整个程序结束。 EVAL 代码 说到eval 代码就比较有意思了。这里要提到一个叫做调用上下文的概念,比如:调用eval 函数时候的上下文,就是一个调用上下文,eval 函数中执行的动作(例如:变量 声明或者函数声明)会影响整个调用上下文: (‘ x = 10’); eval var ( foo(){ (‘ y = 20’); })(); function eval var alert (x); // 10 alert (y); // ”y” is not defined ECStack 会被修改为: ECStack = [ globalContext ]; //eval(‘var x = 10’); ECStack.push ( evalContext, callingContext: globalContext ); // eval exited context ECStack.pop (); //foo function call ECStack.push ( functionContext); //eval(‘ var y = 20’); ECStack.push ( evalContext, callingContext: functionContext ); //return from eval ECStack.pop (); //return from foo ECStack.pop (); 在 1.7 以上版本SpiderMonkey 的实现中(Firefox,Thunderbird 浏览器内置的JS 引擎),允许在调用eval 函数的时候,将调用上下文作为第二个参数传递给eval 函 数。因此,如果传入的调用上下文存在的话,就有可能会影响该上下文中原有的私有变量(在该上下文中声明的变量): function foo(){ var x = 1; retur

文档评论(0)

yaocen + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档