1.11 严格的警告
当打开FireFox中的JavaScript控制台时就会发现显示警告和错误的选项。警告会提示您使用了旧的语法,或者用了与ECMAScript标准不一致的方法等,不过这不一定造成错误1。
例如,下面代码中的fruits变量被定义了两次:
文件:strict-warnings.js (excerpt)
var fruit = 'mango';
if (basket.indexOf('apple') != −1)
{
var fruit = 'apple';
}
应该忽略第二个var,因为var被用来声明第一次使用的变量,而这个声明前面已经做了。图1.4展示了JavaScript控制台怎样将错误作为警告显示出来。
有几种类型不匹配的编码方式会引发类似的警告。例如:
(1) 重复声明变量,这种情况下会产生“redeclaration of var name”信息,上面已经讲过。
(2)使用未声明的变量,通常会提示“assignment to undeclared variable name”。例如,如果将上面代码的第一行改为fruit = 'mango'; 就会弹出这样的错误。
(3)假定某对象存在,这种假设会造成“reference to undefined property name”这样的警告。例如,一个if(document.getElementById)的条件测试语句,其实是假定了getElementById这样的方法是一定存在的,但实际上,浏览器中的JavaScript的自动错误处理能力会将那些不存在的函数转化为一个布尔值false。想实现类似的功能而又不引发警告,可以这样做:
if(typeof document.getElementById != 'undefined')
还有一些与函数相关的警告,以及很多其他类型的警告,不过最有趣的是“useless expression”,当在函数中加入一条什么也不干的语句时就能得到这个警告:
文件:strict-warnings.js (excerpt)
function getBasket()
{
var fruit = 'pomegranate';
fruit;
}
警告并不会阻止脚本的运行,不过如果采用更好的编程方式,就可以避免警告的产生。而程序无警告可以带来很多好处,例如,Mozilla中的脚本在没有警告的情况下会运行得更快,这个主题在第20章还将继续讨论。
类型转换测试
可以通过测试类型转换的值来判断未定义类型,也可以很完美地判断null值,因为ECMAScript标准要求null等同于布尔值false。所以,像前面的例子中一样,我们使用typeof操作符测试未定义类型,也可以像下面例子中那样测试某个元素是否存在,因为getElementById遇到不存在的DOM元素时会返回null值。
if (document.getElementById('something'))
{
┆ 若该元素存在,则执行这些代码
}