21.3 调试技术

21.3.1 把消息记录到控制台

所有主流浏览器都有JavaScript控制台,该控制台可用于查询JavaScript错误。
另外,这些浏览器都支持通过console对象直接把JavaScript消息写入控制台。
这个对象包含如下方法:
❑ error(message):在控制台中记录错误消息。
❑ info(message):在控制台中记录信息性内容。
❑ log(message):在控制台记录常规消息。
❑ warn(message):在控制台中记录警告消息。
记录消息时使用的方法不同,消息显示的样式也不同。
错误消息包含一个红叉图标,而警告消息包含一个黄色叹号图标。

21.3.2 理解控制台运行时

浏览器控制台是个读取-求值-打印-循环(REPL, read-eval-print-loop),与页面的JavaScript运行时并发。
在控制台中执行的命令可以像页面级JavaScript一样访问全局和各种API。
控制台中可以执行任意数量的代码,与它可能会阻塞的任何页面级代码一样。
修改、对象和回调都会保留在DOM和运行时中。

21.3.3 使用JavaScript调试器

ECMAScript 5.1规范定义了debugger关键字,用于调用可能存在的调试功能。
如果没有相关的功能,这条语句会被简单地跳过。
在运行时碰到这个关键字时,所有主流浏览器都会打开开发者工具面板,并在指定位置显示断点。然后,可以通过单独的浏览器控制台在断点所在的特定词法作用域中执行代码。此外,还可以执行标准的代码调试器操作(单步进入、单步跳过、继续,等等)。

21.3.4 在页面中打印消息

另一种常见的打印调试消息的方式是:把消息写到页面中指定的区域。
这个区域可以是所有页面中都包含的元素,但仅用于调试目的;也可以是在需要时临时创建的元素。(log()函数)

21.3.5 补充控制台方法

记住使用哪个日志方法(原生的console.log()和自定义的log()方法),对开发者来说是一种负担。

21.3.6 抛出错误

抛出错误是调试代码的很好方式。如果错误消息足够具体,只要看一眼错误就可以确定原因。
好的错误消息包含关于错误原因的确切信息,因此可以减少额外调试的工作量。

21.4 旧版IE的常见错误

21.4.1 无效字符

JavaScript文件中的代码必须由特定字符构成。
在检测到JavaScript文件中存在无效字符时,IE会抛出”invalid character”错误。
所谓无效字符,指的是JavaScript语法中没有定义过的字符。

21.4.2 未找到成员

旧版IE中所有DOM对象都是用COM对象实现的,并非原生JavaScript对象。在涉及垃圾回收时,这可能会导致很多奇怪的行为。其中,”member not found”错误是IE中垃圾回收程序常报告的错误。这个错误通常会在给一个已被销毁的对象赋值时发生。这个对象必须是COM对象才会出现这个消息。
最好的一个例子就是event对象。IE的event对象是作为window的一个属性存在的,会在事件发生时创建,在事件处理程序执行完毕后销毁。因此,如果你想在稍后会执行的闭包中使用event对象,尝试给event对象赋值就会导致这个错误:

  1. document.onclick = function() {
  2. var event = window.event;
  3. setTimeout(function() {
  4. event.returnValue = false; // 未找到成员
  5. }, 1000);
  6. };

文档被添加了单击事件处理程序。事件处理程序把window.event对象保存在一个名为event的本地变量中。然后,在传递给setTimeout()的闭包中引用这个事件变量。当onclick事件处理程序退出后,event对象会被销毁,因此闭包中对它的引用也就不存在了,于是就会报告未找到成员错误。之所以给event.returnValue赋值会导致”member notfound”错误,是因为不能给已将其成员销毁的COM对象赋值。

21.4.3 未知运行时错误

使用innerHTML或outerHTML属性以下面一种方式添加HTML时,会发生未知运行时错误:
比如将块级元素插入行内元素,或者在表格的任何部分(

、等)访问了其中一个属性。
例如,从技术角度来说,

标签不能包含另一个块级元素,如


在将块级元素插入不恰当的位置时,其他浏览器会尝试纠正,这样就不会发生错误,但IE在这种情况下要严格得多。

21.4.4 语法错误

通常,当IE报告语法错误时,原因是很清楚的。
一般来说,可以通过错误消息追踪到少了一个分号或括号错配。
不过,有一种情况下报告的语法错误并不清楚。
如果网页中引用的一个外部JavaScript文件由于某种原因返回了非JavaScript代码,则IE会抛出语法错误。

21.4.5 系统找不到指定资源

还有一个可能最没用的消息:“The system cannot locate the resourcespecified”(系统找不到指定资源)。
这个错误会在JavaScript向某个URL发送请求,而该URL长度超过了IE允许的最大URL长度(2083个字符)时发生。
这个长度限制不仅针对JavaScript,而且针对IE本身。