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版
- JavaSript运行机制
- 运行机制
- javasript demo
- javasript基础
- javasript体系结构
- JavaSript Array
- JavaSript模块化
- JavaSript模块化
- JavaSript-Map
- JavaSript模块化
- JavaSript模块化
- JavaSript模块化
- javasript ide
- JAVASRIPT正则表达式
- javasript开发宝典
- javasript获得拼音代码
- javasript获得拼音代码
- div跟随javasript
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- boost网络编程一般需要的五步
- C#实用函数大全
- Bug:iOS-改变view的frame后,设置transform,诡异画面
- ANR log,设置ANR时间
- JavaSript运行机制
- flex展示效果之发光效果学习
- 网络编程-TCP服务器端程序和客户端程序
- 建立window的时间服务器(NTP)
- mysql中常用的sql语句
- 用简单的Java代码实现斐波那契数列
- hadoop集群安装手记
- sql拼接实现自由多条件查询及内容分页总结
- 计算出的多小数位的数值控制小数位的方法