15.1.8 消失的变量和函数

我们可能偶尔遇到一个“x is not defined”错误,其中x是一个变量的名字或者我们试图调用的一个函数的名字。问题可能只是我们错误地拼写了变量或函数的名字,或者使用了错误的大小写。然而,如果我们查看自己的代码,可以清楚地看到该变量或函数在脚本中定义了,那么,我们可能遇到了一个“作用域”问题。变量和函数的作用域在3.4.4节详细介绍过,简而言之,如果一个变量定义于一个函数中,那么,只能供该函数使用(或者供定义于该函数内部的其他函数使用)。下面是一个简单的例子:


1 function sayName(name){

2

var message='Your name is'+name;

3}

4 sayName();

5 alert(message);//error:message is not defined


变量message定义于函数sayName()中,因此,它只能存在于该函数中。在该函数之外,message是不存在的,因此,当脚本试图在该函数之外访问这个变量的时候(第5行),将会产生一个错误。

当使用jQuery的时候,我们可能也会遇到这种错误。在5.4节,我们了解到了jQuery的$(document).ready()函数的重要性。函数中的任何内容只能在HTML已经载入之后运行。如果在$(document).ready()函数中定义了变量或函数,而试图在该函数之外访问它们,将会遇到问题,如下所示:


$(document).ready(function(){

var msg='hello';

});

alert(msg);//error:msg is not defined


因此,使用jQuery的时候,确保把所有的程序都放在$(document).ready()函数之中:


$(document).ready(function(){

var msg='hello';

alert(msg);//msg is available

});


快速熟悉

减少错误的编程技巧

处理程序中的错误和bug的最好的办法就是试图尽可能早地预防它们。如果等到编写一个300行的脚本之后并且就要在一个Web浏览器中测试它之前,那么确实很难找到错误的诱因。减少错误的两个最为重要的技巧是:

构建小段的脚本。你现在可能已经知道了,JavaScript程序很难阅读,因为其中充满了)、if、else和函数等内容。不要试图一次性编写一个完整的脚本(除非你真的很棒,脚本很短,或者你很走运)。在编程过程中,有很多种犯错误的方法,但是,分小段地编写脚本可以较好地避免一些错误。

例如,假设我们想要把在“Comments”框中输入的字母的数目紧接着该文本框显示。换句话说,当一个访问者在该字段输入的时候,当前输入的字母的总数目会在该文本框后面显示(一些站点会这么做,它们会限制访问者在一个字段输入的字母数,例如,最多300个字母)。这项任务使用JavaScript确实很容易完成,但是它包含了几个步骤:响应keydown事

件(当访问者在字段输入一个字母的时候),读取字段的值,计算字段中字符的数目,然后在页面上显示数目。我们可以尝试一次性编写这个脚本,但是也可以先为步骤1(响应一个keydown事件)编写代码,然后立即在Web浏览器中测试(使用alert()命令或者下一节所介绍的Firebug的console.log()函数,这可以帮助我们看到一个keydown事件的结果)。如果它有效,我们可以继续第二个步骤,测试它;以此类推。

随着我们获得更多的经验,可能不需要测试这样的小步骤。我们可以一次编写几个步骤,然后测试代码段。

经常测试。我们还应该经常在Web浏览器中测试脚本。至少在完成程序的每一部分之后进行测试,就像上一点中建议的那样。此外,我们应该在不同的浏览器中测试脚本,尤其是IE 6、7和8,Firefox 2和3,Safari 2和3,以及我们认为站点的访问者可能使用的任何其他的浏览器。