Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript的基本错误中断

  对于JavaScript这样的脚本语言,解析时与运行时不太容易区分。有些错误是在运行时发生的,它可以屏蔽,即使不屏蔽也只会中断当前消息处理。但是语法错误等一些重大错误就无法屏蔽,这样的错误会导致代码无法被引擎正确解析,就别提代码本身了。
  首先要搞明白的是,对于JavaScript引擎而言,代码是什么?一个网页是可以用多个SCRIPT标签来载入多个代码的,每一个SCRIPT标签都是从上到下解析运行的。而且JavaScript的执行对于DOM加载是异步的,即使DOM没有加载完(可能存在未加载的SCRIPT标签),代码也已经执行了。这就意味着引擎解析代码的单位是SCRIPT标签,它会把每一个闭合的SCRIPT标签中的代码单独解析。
  然后我们回到讨论错误的问题上,首先是解析时的错误。既然引擎是按SCRIPT为单位来分别解析代码的,那么每一个SCRIPT标签就都存在自身的解析过程,它们是互不相干的(运行过程在程序逻辑层面有关联)。所以,如果其中某个SCRIPT标签存在语法错误而无法解析,那么其它SCRIPT标签依然可以正常运行。
<script>
alert(0); //这个不会输出,因为这整个SCRIPT标签无法解析
=; //这里是语法错误
</script>
<script>
alert(1); //这个可以正确执行
</script>
  但是我们经常遇到一个地方出现语法错误整个程序就都运行不起来的情况,那不是因为一个语法错误引起的。而是因为程序的逻辑层面本身有密切的关联性导致的。比如jQuery中如果包含语法错误就会使基于它的网站程序全部瘫痪。这就是因为jQuery语法错误就会导致jQuery的函数的声明失败,有用到那个函数的地方也自然的跟着错误了。
  另一个问题是解释时的错误会导致整个SCRIPT标签的代码不被解析,所以更不用说运行了。上面这个例子中alert(0)是在错误代码之前,但是依然运行不到,就是这个原因,这也是为什么解析时的错误无法用try语句屏蔽的原因。
  除了解析时的错误外还有运行时的错误,这种错误并不在解析时判断,而是在代码运行之后。但是这也并不简单,首先要搞明白JavaScript的消息机制。运行时的错误会使处理当前消息的代码中断,而在错误之前的代码是可以被执行到,并且运行时的错误不影响其它消息。 console.log("次碳酸钴"); //正常输出
setInterval(function(){
  console.log("计时器事件回调的前半部分正常工作"); //正常输出
  1=1; //赋值错误,当前消息处理中断
  console.log("我也不会被输出哟~"); //无法输出
},1000);
1=1; //赋值错误,当前消息处理中断
console.log("我不会被输出哟~"); //无法输出

  既然这类错误的上文代码可以被运行到,那就自然可以使用try来屏蔽了。try的详细用法属于语法基础的东西翻手册就好,我就不说了。这篇就说这最基本的两类错误,当前还有其它错误的情况,我现在也没有一个完整的总结这里就先不提了。
网名:
54.156.92.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^