浅谈JavaScript中的错误
发布在1970年1月1日view:4669
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。
本文地址:http://www.html-js.com/?p=594转载请注明出处,不要删除此信息 今天在看JavaScript中的分号处理的时候,发现一个现象,以前没有注意过。 主要是ECMASCRIPT规范中的一句话引起的: 当程序解析器从左至右解析程序的时候,如果遇到了输入文档流的结尾,而解析器无法正常解析文档流的时候,一个分号会被自动插入到输入流的结尾。 这句话看起来道理很简单,但是由于之前对JavaScript的错误没有仔细想过,所以看过之后不得要领,随后仔细想了想,试了试,算是有点小心得了。 下面是我的片面之词,希望有不对的地方大家提出自己的看法。 首先从一个小例子开始:
<script>
alert("第一次弹窗");
  (function(){
      return ee
  })()
alert("第二次弹窗")
</script>
上面这段代码放在html里运行后的结果是什么呢? 结果只会弹出一次窗口,因为在执行闭包里的return ee的时候发现变量ee是没有定义的,程序将停止执行。 然后,我们换一段代码:
<script>
alert("第一次弹窗");
  function(){
      return ee}
  }
alert("第二次弹窗")
</script>
这次的结果是什么呢? 第二段代码不会有任何反应,因为这是另一种错误。 这两段代码正是说明了两种js错误类型,第一种是运行时错误,第二种是解析期错误。 解析时错误是由于语法错误引起的,而运行时错误则是程序员在书写的时候逻辑错误引起的。 通过上面的例子来看,解析时错误比运行时错误更致命,因为它会直接导致程序不运行,任何语句都不会执行。而运行时错误只有发生后才会导致程序中断。 解析时错误是很容易避免的,根据上面的特点,在调试程序错误的时候,我们可以先查看是否程序的语法有错误。在文档头部书写一个alert语句,如果此语句无法运行就说明程序的语法有错误,这种错误基本都很容易发现,而且这两种错误在浏览器调试工具中显示的地方不同,运行时错误通常通过动态捕捉,例如:firebug和chrome的script选项卡里的错误捕捉功能,而解析时错误则显示在控制台中,chrome里的console选项卡里。 上面说到的情况只是脚本直接嵌入在页面里的时候的情况。还有种情况是主页面引用了多个js文档,在这些文档里发生了上述错误会引起什么现象呢? 看例子:
<script src="a1.js"></script>
<script src="a2.js"></script>
a1.js中的代码如下:
alert("第一次弹窗");
  (function(){
      return ee}
  })()
alert("第二次弹窗")
a2.js中的代码如下:
alert("dd")
大家想想这次的结果是什么呢? 上面的代码会弹出一个“dd”的对话框。也就是说a1中的语法错误并没有影响a2的解析。可见对多个文档的解析是分离的,a1中的语法错误只会阻断a1这个文档的解析,而不会影响a2的解析和执行,如果a1解析错误,解析器跳过这个文档。 这也是为什么文章开头我提到那句话的原因,本来料想如果解析到文档流末尾的时候发现本文档无法解析应该跳出解析,而文档却在此说明这种情况仍然需要加一个分号,然后继续往下解析下一个文档流。也就是说某个文档解析错误的时候并不影响接下来的文档的解析。 之后,我们来看看这种情况下a1.js中如果发生的是运行时错误会怎么样? 将a1.js的代码改为如下:
alert("第一次弹窗");
  (function(){
      return ee
  })()
alert("第二次弹窗")
希望如你所想,结果是首先弹出“第一次弹窗”,然后弹出“dd”。 可见运行时的错误也不会阻断其他文档流的执行,而只是阻断当前文档的执行。 总之,这两种错误还是有些区别的,了解清楚这些区别对于程序的调试还是有一定好处的。
评论
发表评论
暂无评论
WRITTEN BY
芋头
思考,去做,做好,做的比别人好
TA的新浪微博

我的收藏