理解Javascript_12_执行模型浅析

  大家有没有想过,一段javascript脚本从载入浏览器到显示执行都经过了哪些流程,其执行次序又是如何。本篇博文将引出'javascript执行模型'的概念,并带领大家理解javascript在执行时的处理机制。

 

简单的开始

简单的代码:

<script type="text/javascript" src="xxx.js"></script>
<script type="text/javascript">var i = 10;function say(msg){alert(msg);}
</script>
<script type="text/javascript">j=100;say("hello world");
</script>

上面代码段的运行顺序是:

step1. 读入第一个代码段
step2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到step5
step3. 创建全局执行环境(对var变量和function定义做"预解析")
step4. 执行代码段(调用函数、进入eval时,都会创建新的执行环境),有错则报错(比如变量未定义)
step5. 如果还有下一个代码段,则读入下一个代码段,重复step2
step6. 结束

对于step1中的'脚本段'指的是<script>... ...</script>标签中的内容,还包括外部引入的脚本文件,如<script src="xxx.js"></script>也被列是脚本段的范畴。那step2中的语法分析又是什么呢?简单的理解语法分析就是查看Javascript代码的语法结构是否正确。如:

<script type="text/javascript">
var a = 10;
if(a>10{alert('yes');
}
</script>

很明显,代码无法通过语法分析,if这个条件语句的输写语法是错误的。step3和step4中的'执行环境'是指什么,全局执行环境和调用函数创建的执行环境有什么区别?执行环境内部又有哪些处理?... ...

 

注:下面的部分内容为原来《javascript提速_01_引用变量优化》一文中的前两节的完整版本。

 

关于执行环境(Execution Context)

所有 JavaScript 代码都是在一个执行环境中被执行的。它是一个概念,一种机制,用来完成JavaScript运行时作用域、生存期等方面的处理。

 

可执行的JavaScript代码分三种类型:
1. Global Code,即全局的、不在任何函数里面的代码,例如:一个js文件、嵌入在HTML页面中的js代码等。
2. Eval Code,即使用eval()函数动态执行的JS代码。
3. Function Code,即用户自定义函数中的函数体JS代码。

不同类型的JavaScript代码具有不同的Execution Context

 

在一个页面中,第一次载入JS代码时创建一个全局执行环境,当调用一个 JavaScript 函数时,该函数就会进入相应的执行环境。如果又调用了另外一个函数(或者递归地调用同一个函数),则又会创建一个新的执行环境,并且在函数调用期间执行过程都处于该环境中。当调用的函数返回后,执行过程会返回原始执行环境。因而,运行中的 JavaScript 代码就构成了一个执行环境栈。

 

让我们来看一个示例:

<script type="text/javascript">function Fn1(){function Fn2(){alert(document.body.tagName);//BODY//other code...}Fn2();}Fn1();//code here
</script>

以上是程序从上到下执行时的执行环境栈情况图。

 

补充说明:

全局执行环境对应的是Global Code(全局代码)

Fn1执行环境、Fn2执行环境通称为函数执行环境对应的是Function Code(函数定义代码)

 

程序在进入每个执行环境的时候都会创建一个叫做Variable Object的对象。

针对于函数执行环境,函数对应的每一个参数、局部变量、内部方法都会在Variable Object上创建一个属性,属性名为变量名,属性值为变量值。针对于全局执行环境,具有相同的行为。但是要强调的一点是在全局执行环境中Varible Object就是Global Object,关于Global Object在《理解Javascript_03_javascript全局观》中已经说明了,可以简单的理解为window对象。这也就解释了全局方法和全局变量为什么都是window对象的属性或方法的原因,请看如下代码:

var num = 123;
alert(window.num);//123
function say(msg){alert(msg);
}
window.say("hello");//hello

最后要说的是,Variable Object对象是一个内部对象,JS代码中无法直接访问。

 

关于Scope/Scope Chain

 在访问变量时,就必须存在一个可见性的问题,这就是Scope。更深入的说,当访问一个变量或调用一个函数时,JavaScript引擎将不同执行位置上的Variable Object按照规则构建一个链表,在访问一个变量时,先在链表的第一个Variable Object上查找,如果没有找到则继续在第二个Variable Object上查找,直到搜索结束。这也就形成了Scope Chain的概念。

 

作用域链图,清楚的表达了执行环境与作用域的关系(一一对应的关系),作用域与作用域之间的关系(链表结构,由上至下的关系)。

 

注:本文仅仅从全局角度的看待javascript执行模型,因此不够深入,具体执行细节,请参见后续博文。

 

参考:

http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html
http://lifesinger.org/blog/2009/01/javascript-run-mechanism/

转载于:https://www.cnblogs.com/fool/archive/2010/10/16/1853326.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么制作铁闸门_“短笛”拿铁,最近的心头好!

其实花式咖啡除了市面上一些常见的款式外&#xff0c;还有一些是不常见又好喝的&#xff01;今天来给大家推荐一款“短笛”拿铁&#xff0c;最近的最爱&#xff01;什么是短笛拿铁&#xff1f;piccolo latte&#xff0c;在意大利文中“piccolo”是小的意思&#xff0c;而latte则…

计算机发展趋势是规格化,2016年春季计算机应用基础月考卷(4月).doc

2016年春季学期计算机应用基础4月考卷姓名&#xff1a; 得分&#xff1a;一、单项选择题。(共有75个小题&#xff0c;每小题2分&#xff0c;共计150分)1. 计算机的发展通常认为经历了四代&#xff0c;第二代计算机的主要元器件是( )A. 电子管 B&#xff0e;晶体管 C&#xff0e…

C#与.NET程序员面试宝典 1.3 投递简历

在IT行业中&#xff0c;应聘是大多数人获得工作机会的主要途径&#xff0c;通常人们从学校毕业后即开始参加各种形式的招聘场合。从招聘方的角度来说&#xff0c;不同的公司有不同的招聘渠道&#xff0c;但大多数都会重点采用网络、校园、招聘会3个渠道进行招聘员工。想要应聘到…

回归初心

软件工程这门课程已经上了两周了&#xff0c;可以说这两周过得非常的充实&#xff0c;除了上课时间&#xff0c;其余的课余时间都用来写作业和看书了。我想&#xff0c;这才是刚进入大学时&#xff0c;我憧憬的生活。现在看来&#xff0c;过去的三年确实会感到有点遗憾&#xf…

scipy是python下的什么_Python下科学计算包numpy和SciPy的安装

Python下大多数工具包的安装都很简单&#xff0c;只需要执行 “python setup.py install”命令即可。然而&#xff0c;由于SciPy和numpy这两个科学计算包的依赖关系较多&#xff0c;安装过程较为复杂。网上教程较为混乱&#xff0c;而且照着做基本都不能用。在仔细研读各个包里…

计算机指令格式哪几部分组成,计算机的指令格式,通常是由()两部分组成。 - 百科题库网...

1.8086汇编语言指令由标号、操作码、操作数和注释组成,其中标号和注释可以省略&#xff0c;操作码指出指令要过盛的功能,操作数指出完成的对象. 2.变量和标号的区别是变量由伪指令定义&#xff0c;标号是指令前面的符号&#xff0c;变量也伪指令定义符之间由空格分隔&#xff0…

执行phpinfo();时提示:date_default_timezone_set()

执行phpinfo();时提示&#xff1a; Warning: phpinfo() [function.phpinfo]: It is not safe to rely on the systems timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those …

nlog轻量级日志组件

一.NLog简要介绍: 1.NLog是一个简单灵活的.NET日志记录类库。通过使用NLog&#xff0c;我们可以在任何一种.NET语言中输出带有上下文的&#xff08;contextual information&#xff09;调试诊断信息&#xff0c;根据喜好配置其表现样式之…

SQL Server 2016 RC0 安装(超多图)

微软最新版本的数据库SQL Server 2016在2016年3月9日推出了RC0版本。已经提供了包括简体中文等多种语言版本&#xff0c;不过联机丛书还是英文版的。对OS的要求是WIN8&#xff0c;WIN10&#xff0c; WIN2012&#xff0c;只有64位版本。让我们下载最新的版本安装测试下。Figure-…

vfp赋值超过7位出错_JDK1.7下的HashMap的源码分析

源码分析jdk1.7下的HashMap我们都知道1.7版本的hashmap的底层是数组加链表构成的&#xff0c;那么今天我们就来自己分析一波源码~篇幅有点长&#xff0c;废话不多说&#xff0c;直接开始分析~「属性声明」//初始化容量 static final int DEFAULT_INITIAL_CAPACITY 1 <4;…

计算机常用数制转换说课稿,进制与进制转换说课稿

《数制及其转换》 尊敬的各位老师&#xff1a;大家好&#xff01;我说课的内容是《数制及其转换》。一、说教材1、教材分析《数制及其转换》是从人民邮电出版社教材《大学计算机基础》第一章第三节内容&#xff0c;它是理解计算机原理的重要突破点&#xff0c;奠定了学生对计算…

java.net.SocketException: Permission denied解决

该文引自&#xff1a;http://hi.baidu.com/sunfengwei/item/6c4c8b68d015ea2569105bc2 在Android项目开发时&#xff0c;在获取IP地址时出现java.net.SocketException: Permission denied异常&#xff0c;这是一个典型的异常。 解决方法&#xff1a; 在AndroidManifest.xml 配置…

Android代码优化——使用Android lint工具

Android代码优化——使用Android lint工具

【转】wordpress/wp-includes目录文件概述

wp-includes目录1.wp-includes/cache.php2.wp-includes/capabilities.php3.wp-includes/class-IXR.php&#xff1a;Incutio XML-RPC库。包括了 XML RPC支持函数。由http://scripts.incutio.com/xmlrpc/提供支持。4.wp-includes/classes.php&#xff1a;包括了基本的类&#xff…

python自带的统计函数_NumPy统计函数的实现方法

numpy.amin()和numpy.amax()numpy.amin()用于计算数组中元素沿着指定轴的最小值。numpy.amax()用于计算数组中元素沿着指定轴的最大值anp.array([1,3,6],[3,4,11],[6,1,4])print(np.amin(a,1) #每行最小值print(np.amin(a,0) #每列最小值print(np.amax(a) #所有元素中最大值pri…

笔记本打开计算机盘非常慢,笔记本开机慢怎么办【方法步骤】

许多人多余学术研究或是体育项目之类是十分精通&#xff0c;白手起家&#xff0c;闯出一片事业的也不在少数&#xff0c;但是在面对 高科 技产品时确实碰到了一鼻子灰&#xff0c;确实&#xff0c;各位读者朋友们所精通专业不同&#xff0c;在加上原本科技产品就是一大难题&…

php配置支持mysql解决本地安装wordpress问题

先说一下我被折腾的纠结&#xff0c;我想在本地apahcephpmysql环境下安装wordpress&#xff0c;当配置好apache和php后在浏览器中能显示出phpinfo信息&#xff0c;但运行wordpress文件夹里的index.php就出现您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展。在网上找…

关于什么时候用pop什么时候用dismiss

假如你是类似于这样跳转过来的self presentViewController: animated: completion:那么你回去的时候就要dismiss假如你是这样跳转过来的 self.navigationController pushViewController: animated: 那么你回去就要用pop转载于:https://www.cnblogs.com/xj76149095/p/5280663.ht…

DotNET企业架构应用实践-系列目录

系列介绍 我一直在写关于AgileEAS.NET平台的一系列文章&#xff0c;也一直在推广AgileEAS.NET平台&#xff0c;本来也无意于独立的写这么一个系列&#xff0c;最早我是混杂在AgileEAS.NET平台中进行介绍的&#xff0c;即介绍平台的同时介绍平台以及应用平台进行开发所涉及的一些…

svn服务器怎么导入项目idea,idea 通过Subversion导入项目,idea项目没有关联到svn

idea 通过Subversion导入项目&#xff0c;idea项目没有关联到svn环境- IDEA&#xff1a;IntelliJ IDEA 2017.2- svn&#xff1a;1.9.71、检出代码idea Checkout from Subversion导出项目代码&#xff1a;2、提交代码修改某个文件之后&#xff0c;提交代码到svn服务器&#xff0…