使用脚本语言时,变量是其中最基本的元素,脚本执行过程中,往往需要用一个单元将信息存储起来,变量就是这样的一个命名的存储单元,存储在这个单元中的数据就是变量的值。例如,我们可以创建一个名称为Visitors的变量将访问站点的人数记录下来,这个变量的值是存储在计算机的内存中,但在使用的过程中,我们并不需要知道它的内存地址,只要通过Visitors,我们就可以直接获取该变量的值或者修改这个值。
后面我们还讲到常量的概念,虽然说常量和变量一样可以赋予数值,但是常量和变量有所不同,变量可以反复赋值,而常量的数值一旦确定下来之后就不能发生变化了。
使用变量时,一般要先声明变量,而命名变量时也要按照VBScript的命名要求才能正确命名变量。
VBScript和Visual Basic一样,在使用变量前并可以不对变量声明,在例2.1中,我们用到了一个变量Message,但是我们并没有预先对它进行声明,这并不影响脚本的执行。
<HTML>
<HEAD>
<TITLE>
Use variable without declare </TITLE>
<SCRIPT
LANGUAGE="VBScript">
<!--
Message =
“hello”
window.document.write(Message)
-->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
例2.1 在脚本中未声明而使用一个变量
在这个页面中,执行的结果是在页面上显示字符串hello。在VBScript中,不声明而直接使用变量,我们称为对这是对变量的隐式声明。
Optioin Explicit语句强制要求显式声明脚本中使用的所有变量,在使用这条语句之后,必须使用Dim、Private、Public或者ReDim语句声明所有变量。不过Option Explicit语句在页面中的位置很特殊,它必须放置于所有HTML文本和脚本命令之前,也就是说它必须作为ASP页面的起始语句之一。其语法如下所示:
Option Explicit
如果将这句脚本加入到例2.1中,那么在运行的过程中将会出现如下错误:
Microsoft VBScript 运行时错误 error ‘800a01f4’
变量未定义: ‘Message’
/message.asp, line 7
隐式声明变量并不是一个良好的编程习惯。因为在编写脚本的过程中,我们很有可能出现因为拼写疏忽而导致脚本执行出现意外错误,并且这种错误是难以被发现和改正的,例如,如果我们在开始对变量Message赋值,但是在后面脚本程序中,由于疏忽,我们将变量拼写成为Messag,在不要求变量显式声明的情况下,脚本执行将不会产生错误,Message和Messag会被视为两个不同的变量,然而结果明显和我们预期不符,这种错误是很难发现的。我们建议在脚本时使用Option Explicit语句,要求变量显式声明,这是一种良好的编程习惯。
在声明变量的时候,我们一般使用Dim语句,其语法如下所示:
Dim varname[([subscripts])]
其中,varname是变量的名称,在声明数组的时候,subscripts代表的是数组的上界。
我们在VBScript中声明变量时,不需要指定变量的数据类型,这是由于VBScript中,所有变量都是相同的数据类型,都是Variant类型变量,这是一种特殊的数据类型,它代表了Visual Basic中其他所有的数据类型。Variant类型可以根据存储在其中的信息自动识别实际数据类型。
例如,下面的声明中,我们声明了变量Message:
Dim Message
除了变量之外,我们还可以声明数组。在声明数组的时候,变量名后面带有括号,下面的语句中,我们声明了一个数组,名称为Items:
Dim Items(10)
对于这个数组,数组的上界是10,而下界总是默认为0,所以,数组中的元素是11个。在使用数组的时候,我们可以通过数组的下标引用数组,例如:
SomeData = Item(3)
在声明数组的时候,我们也可以不局限于一维数组,VBScript支持数组最大的维数是60。声明多维数组时需要用逗号分隔代表数组上界的数组,在下面的声明中,ItemTable是一个4行5列的二维数组:
Dim ItemTable(3, 4)
使用ReDim语句,我们可以管理动态数组,上面我们声明数组的时候直接指定了数组的大小,这种类型的数组就是静态数组;动态数组和静态数组不同之处在于,动态数组的大小可以在脚本执行的过程中发生变化。
在声明动态数组的时候,我们需要首先使用Dim语句或者ReDim语句对数组进行声明,但不要指定数组的上界,也就是说,在数组声明的括号中不包含任何数字,例如:
Dim Visitors()
然后,再使用ReDim语句设置数组的大小,例如,在下面的声明中,我们将Visitors数组的上界设定为10:
ReDim Visitors(10)
在使用ReDim语句的过程中,我们还可以使用Preserve关键字,当使用Preserver关键字调整数组大小的时候,将会保留数组中的内容,例如,假设我们先将Visitors数组上界设定为10,然后我们再使用Preserve关键字将上界修改为20:
ReDim Preserve Visitors(20)
这样,在调整数组大小的过程中,数组中前11个元素还会保留。
注意:对于动态数组而言,调整数组大小的次数是没有限制的,但是,如果我们使数组的大小变小,那么数组中被删除元素的数据会丢失。
使用Dim语句可以在脚本的过程中声明的变量,也可以在过程外声明变量,在过程中声明的变量称为过程级变量(Procedure level),在过程外声明的变量称为脚本级变量(Script level),过程级变量只能应用于过程中,脚本级变量可以应用于脚本中所有的过程。关于过程,我们会在后面的章节中进行详细讨论。
Public语句不能用于声明过程级变量,只能声明脚本级变量,运用Public声明的变量声明的变量可以运用于脚本的所有过程中。其语法如下所示:
Public varname[([subscripts])]
其中,varname代表的是变量名称,subscripts代表的是数组的上界。和Dim语句一样,Public语句也能够声明动态数组和静态数组,以及多维数组。
Private语句和Public语句是相对的,Private语句也只能声明脚本级变量,运用Private语句声明的变量只能在声明该变量的脚本中使用。其语法如下所示:
Private varname[([subscripts])]
其中,varname代表的是变量名称,subscripts代表的是数组的上界。和Dim语句一样,Private语句也能够声明动态数组和静态数组,以及多维数组。
在变量命名的过程中,必须遵循以下几条规则:
1. 变量名称的第一个字符必须是字母,例如,BookName是合法的变量名称,而诸如_bookname、3bookname这些变量名称都是非法变量名称。
2. 不能包含嵌入的句号(.),例如,Book.Name就是非法的变量名称。
3. 变量名称的长度必须少于255个字符。
4. 在变量的作用域中,变量的名称要求唯一。变量的作用域是有声明变量的位置所决决定的,如果是在过程中声明变量,那么变量的作用域是整个过程;如果是在过程外声明变量,那么变量的作用域是整个脚本。这也就是说,如果具有相同名称的两个或者多个变量具有相同的作用域,那么将会出错。不过在两个过程中,我们可以将变量命名为相同的名称,例如,如果在两个过程中,我们都需要用到临时变量,那可以将这两个临时变量都命名为temp。
在一般情况下,我们在给变量命名时,希望能够使用有意义的变量名称,如果需要使用一个变量表示一本书的价格,虽然命名为j或book都没有什么错误,但若能命名为bookPrice会使得脚本有更好可读性,也可以方便脚本开发人员进行脚本的编写和调试工作。
这是我们对于变量命名的约定,并不是强制性要求,用户完全可以不按照我们的约定来做(只要不违反VBScript对于变量命名的要求就可以了),但养成良好的编程风格对于ASP页面开发人员来说,还是很有意义的。
创建如下形式的表达式给变量赋值:变量在表达式左边,要赋的值在表达式右边。例如:
MyVariable=200
多数情况下,只需为声明的变量赋一个值。只包含一个值的变量被称为标量变量。有时候,将多个相关值赋给一个变量更为方便,因此可以创建包含一系列值的变量,称为数组变量。数组变量和标量变量是以相同的方式声明的,唯一的区别是声明数组变量时变量名后面带有括号( )。下例声明了一个包含11个元素的一维数组:
Dim A(10)
虽然括号中显示的数字是10,但由于在VBScript中所有数组都是基于0的,所以这个数组实际上包含11个元素。在基于0的数组中,数组元素的数目总是括号中显示的数目加1。这种数组被称为固定大小的数组。
在数组中使用索引为数组的每个元素赋值。从0到10,将数据赋给数组的元素,如下所示:
A(0) = 256
A(1) = 324
A(2) = 100
…
A(10) = 55
与此类似,使用索引可以检索到所需的数组元素的数据。例如:
…
SomeVariable = A(8)
…
数组并不仅限于一维。数组的维数最大可以为60(尽管大多数人不能理解超过3或4的维数)。声明多维数组时用逗号分隔括号中每个表示数组大小的数字。在下例中,MyTable变量是一个有6行和11列的二维数组:
Dim MyTable(5, 10)
在二维数组中,括号中第一个数字表示行的数目,第二个数字表示列的数目。
也可以声明动态数组,即在运行Script时大小发生变化的数组。对数组的最初声明使用Dim语句或ReDim语句。但是对于动态数组,括号中不包含任何数字。例如:
Dim
MyArray()
ReDim AnotherArray()
要使用动态数组,必须随后使用ReDim确定维数和每一维的大小。在下例中,ReDim将动态数组的初始大小设置为25,而后面的ReDim语句将数组的大小重新调整为30,同时使用Preserve关键字在重新调整大小时保留数组的内容。
ReDim
MyArray(25)
…
ReDim
Preserve MyArray(30)
重新调整动态数组大小的次数是没有任何限制的,但是应注意:将数组的大小调小时,将会丢失被删除元素的数据。