JavaSript运行机制

来源:互联网 发布:查看端口是否被占用 编辑:程序博客网 时间:2024/06/07 19:44

因最近接触Nodejs开发,现在觉得自己应该从头开始学习下JavaScript,作为JS学习的第一篇文章,我想把自己关于JavaScript的运行原理总结下,错误之处请多多指点

1、从一个简单例子开始

<script type="text/javascript">  var name = 'Tianhu.Peng';  alert(name);</script>
上面输出的结果为“Tianhu.Peng”,JavaScript的这种运行方式叫做“预解析”--JavaScript引擎会优先解析var变量和function函数定义。在预解析完成后才会执行代码。


2、编译过程

完成上面解析var变量和function函数定义后(预解析)就进入了编译阶段

我理解编译阶段是从高级语言对比理解的

对于C# \ JAVA等编译型语言来说,编译的步骤分为:词法分析 - 语法分析 - 语义检查 - 代码优化 和 字节生成

当对于JavaScript来说,编译步骤分为:词法分析 和 语法分析后得到语法树后,就可以开始解释执行了,这笔编译性语言少了很多步,所以这也可以认为是解释性语言比编译性语言运行速度快的主要原因之一。

1)词法分析:词法分析的主要作用是打标记号,书上的说法是将字符流(char stream)转换为记号流(token stream)

如:下面的代码

<script type="text/javascript">  a + b = c;</script>
记号可能会变成这样

名字 a

加号

名字 b

等号

名字 c

2) 上面经过词法分析后就进入语法分析构造语法树

形象的比喻就是:有课很茂盛的大树,我们将语句、变量和符号等有序的放置在每根树叉上,整个连起来就是一个完整的语法分析结构。

网上的例子:

<script type="text/javascript">if (typeof a == 'undefined') {  a = 0;} else {  a = a;}alert(a);</script>


从这里我们可以知道,如果无法构建语法树,程序就会返回停止并报错;我们知道了JS报错的一个重要环节了,收获颇丰


3、经过编译阶段后就是JS执行过程

一定要清楚情况,执行的前提是内存中已经有语法树的存在,JS引擎会根据这棵语法树结构边解释边执行。

在解释过程中,JS引擎会严格按照作用域来执行,作用域是在预处理时就定义好的,而不是执行时决定的。

根据树结构,JS引擎通过作用域把多个嵌套的作用域连在一起,这个就相当于数据树枝将所有的链接起来;在专业术语就是这个作用域链就相当于一个表的索引,通过给它们填写编号存储它们的嵌套关系。当解释器解释某个变量的值时,就会通过这个索引快速查找,如果找不到,没有关系,有一个公用的值"undefined"


4、编译和执行的关系

看个例子

<script type="text/javascript">alert(a);var a = 1;alert(a);</script>
输出undefined 和 1

我们可以看书a的第一次是没有赋任何值的;但实际上不是的,a被赋予了“undefined”

这里面我要了解JS执行的过程,在预编译对所有变量和函数进行处理时,所有的代码都是清晰可见的。所以,你就会发现,当没有赋予任何值事,Javascript会将"undefined"设置默认值。第二次输出1,是一位,我们改变了a的赋值。


本文参考了  javasript高级编程第6版

0 0
原创粉丝点击