也谈JavaScript运行机制
时间:2010-10-12 来源:dodohua
最近被JavaScript的跨域问题和兼容性问题弄得焦头烂额,于是急忙抽抽时间复习复习JavaScript基础,这里就说说我对JavaScript运行机制的一些见解。
JavaScript不同于现时的c#,Java等编译性语言,得写好源代码后,运行编译程序进行编译成字节码(java),clr等接近汇编的语言,老麻烦了,而且像Java和c#还不能脱离他的虚拟机运行呢。但是JavaScript只要编写好,下一秒就能在浏览器运行,非常方便快捷,因为JavaScript是解释性语言,是运行的时候动态解析执行的。
也许你会说,既然是逐行解析运行的,就没有必要说什么见解啦,多简单哦!!其实不然,所谓的逐行解析只是形象的说法,任何语言运行之前,都要免不了词法,语法的解析,解析失败是会报错的。但是可能大家会疑问,很多情况,浏览许多网站的时候,浏览器都会报JavaScript脚本错误,为什么JavaScript的函数还能运行呢?其实它运行成功的是那些没有错误的JavaScript函数而已,而且JavaScript加载编译的时候,是以<script>遵守document加载html节点树形加载的,所以是先加载的<Script>是会先运行的,但是在<script>标签里面,但JavaScript遇到编译错误的代码行的时候就会报错跳出这段<script>,所以之前没有跳出<script>的时候加载的代码段因为已经加载到document里面,所以是可以运行的:
代码<script>
//同一个script内
var a = "test";
alert(a);//a正确定义,所以这里会在浏览器弹出对话框
alert(b);//b事先没有定义,所以这里出现语法错误,这里就会出错跳出
//后面的都没有语法错误,但是因为上面语法错误,跳出这段<script>,所以下面到</scirpt>之内的代码无论如何都不会运行的。同理,写的函数,在别的地方也会调用失败,因为下面的代码根本没有加载到document里
var c= "test";
alert(c)
</script>
但是,正因为跳出了只是本段<script>,所以是不会影响其他<script>的加载的,所以下面语法正确的<script>块还是会正常的运行,如:
代码
<scrirpt type="text/javascript">
alert(test);//没有定义test,所以出错,下面的不能运行
var test = "test";
alert(test);//这里不能运行
</script>
<--!接着下一段JavaScript代码-->
<scrirpt type="text/javascript">
var test = "test";
alert(test);//可以运行,不受上一段JavaScript影响
</script>
所以到这里,JavaScript的运行机制就很明朗啦,自上而下的加载解析到document,遇到词法错误,语法错误,会跳出本段<script>标签,但是还会继续加载随后的<script>标签的JavaScript代码,如此循环,直到document加载完毕(完)。