2.3  VBScript变量

使用脚本语言时,变量是其中最基本的元素,脚本执行过程中,往往需要用一个单元将信息存储起来,变量就是这样的一个命名的存储单元,存储在这个单元中的数据就是变量的值。例如,我们可以创建一个名称为Visitors的变量将访问站点的人数记录下来,这个变量的值是存储在计算机的内存中,但在使用的过程中,我们并不需要知道它的内存地址,只要通过Visitors,我们就可以直接获取该变量的值或者修改这个值。

后面我们还讲到常量的概念,虽然说常量和变量一样可以赋予数值,但是常量和变量有所不同,变量可以反复赋值,而常量的数值一旦确定下来之后就不能发生变化了。

使用变量时,一般要先声明变量,而命名变量时也要按照VBScript的命名要求才能正确命名变量。

2.3.1  声明变量

VBScriptVisual 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中,不声明而直接使用变量,我们称为对这是对变量的隐式声明。

2.3.1.1  Option Explicit

Optioin Explicit语句强制要求显式声明脚本中使用的所有变量,在使用这条语句之后,必须使用DimPrivatePublic或者ReDim语句声明所有变量。不过Option Explicit语句在页面中的位置很特殊,它必须放置于所有HTML文本和脚本命令之前,也就是说它必须作为ASP页面的起始语句之一。其语法如下所示:

Option Explicit

如果将这句脚本加入到例2.1中,那么在运行的过程中将会出现如下错误:

Microsoft VBScript 运行时错误 error ‘800a01f4’

变量未定义: ‘Message’

/message.asp, line 7

隐式声明变量并不是一个良好的编程习惯。因为在编写脚本的过程中,我们很有可能出现因为拼写疏忽而导致脚本执行出现意外错误,并且这种错误是难以被发现和改正的,例如,如果我们在开始对变量Message赋值,但是在后面脚本程序中,由于疏忽,我们将变量拼写成为Messag,在不要求变量显式声明的情况下,脚本执行将不会产生错误,MessageMessag会被视为两个不同的变量,然而结果明显和我们预期不符,这种错误是很难发现的。我们建议在脚本时使用Option Explicit语句,要求变量显式声明,这是一种良好的编程习惯。

2.3.1.2  Dim

在声明变量的时候,我们一般使用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是一个45列的二维数组:

Dim ItemTable(3, 4)

2.3.1.3  ReDim

使用ReDim语句,我们可以管理动态数组,上面我们声明数组的时候直接指定了数组的大小,这种类型的数组就是静态数组;动态数组和静态数组不同之处在于,动态数组的大小可以在脚本执行的过程中发生变化。

在声明动态数组的时候,我们需要首先使用Dim语句或者ReDim语句对数组进行声明,但不要指定数组的上界,也就是说,在数组声明的括号中不包含任何数字,例如:

Dim Visitors()

然后,再使用ReDim语句设置数组的大小,例如,在下面的声明中,我们将Visitors数组的上界设定为10

ReDim Visitors(10)

在使用ReDim语句的过程中,我们还可以使用Preserve关键字,当使用Preserver关键字调整数组大小的时候,将会保留数组中的内容,例如,假设我们先将Visitors数组上界设定为10,然后我们再使用Preserve关键字将上界修改为20

ReDim Preserve Visitors(20)

这样,在调整数组大小的过程中,数组中前11个元素还会保留。

注意:对于动态数组而言,调整数组大小的次数是没有限制的,但是,如果我们使数组的大小变小,那么数组中被删除元素的数据会丢失。

2.3.1.4  Public

使用Dim语句可以在脚本的过程中声明的变量,也可以在过程外声明变量,在过程中声明的变量称为过程级变量(Procedure level),在过程外声明的变量称为脚本级变量(Script level),过程级变量只能应用于过程中,脚本级变量可以应用于脚本中所有的过程。关于过程,我们会在后面的章节中进行详细讨论。

Public语句不能用于声明过程级变量,只能声明脚本级变量,运用Public声明的变量声明的变量可以运用于脚本的所有过程中。其语法如下所示:

Public varname[([subscripts])]

其中,varname代表的是变量名称,subscripts代表的是数组的上界。和Dim语句一样,Public语句也能够声明动态数组和静态数组,以及多维数组。

2.3.1.5  Private

Private语句和Public语句是相对的,Private语句也只能声明脚本级变量,运用Private语句声明的变量只能在声明该变量的脚本中使用。其语法如下所示:

Private varname[([subscripts])]

其中,varname代表的是变量名称,subscripts代表的是数组的上界。和Dim语句一样,Private语句也能够声明动态数组和静态数组,以及多维数组。

2.3.2  变量的命名规则

在变量命名的过程中,必须遵循以下几条规则:

1. 变量名称的第一个字符必须是字母,例如,BookName是合法的变量名称,而诸如_bookname3bookname这些变量名称都是非法变量名称。

2. 不能包含嵌入的句号(.),例如,Book.Name就是非法的变量名称。

3. 变量名称的长度必须少于255个字符。

4. 在变量的作用域中,变量的名称要求唯一。变量的作用域是有声明变量的位置所决决定的,如果是在过程中声明变量,那么变量的作用域是整个过程;如果是在过程外声明变量,那么变量的作用域是整个脚本。这也就是说,如果具有相同名称的两个或者多个变量具有相同的作用域,那么将会出错。不过在两个过程中,我们可以将变量命名为相同的名称,例如,如果在两个过程中,我们都需要用到临时变量,那可以将这两个临时变量都命名为temp

在一般情况下,我们在给变量命名时,希望能够使用有意义的变量名称,如果需要使用一个变量表示一本书的价格,虽然命名为jbook都没有什么错误,但若能命名为bookPrice会使得脚本有更好可读性,也可以方便脚本开发人员进行脚本的编写和调试工作。

这是我们对于变量命名的约定,并不是强制性要求,用户完全可以不按照我们的约定来做(只要不违反VBScript对于变量命名的要求就可以了),但养成良好的编程风格对于ASP页面开发人员来说,还是很有意义的。

2.3.3  给变量赋值

创建如下形式的表达式给变量赋值:变量在表达式左边,要赋的值在表达式右边。例如:

MyVariable=200

2.3.4  标量变量和数组变量

多数情况下,只需为声明的变量赋一个值。只包含一个值的变量被称为标量变量。有时候,将多个相关值赋给一个变量更为方便,因此可以创建包含一系列值的变量,称为数组变量。数组变量和标量变量是以相同的方式声明的,唯一的区别是声明数组变量时变量名后面带有括号( )。下例声明了一个包含11个元素的一维数组:

Dim A(10)

虽然括号中显示的数字是10,但由于在VBScript中所有数组都是基于0的,所以这个数组实际上包含11个元素。在基于0的数组中,数组元素的数目总是括号中显示的数目加1。这种数组被称为固定大小的数组。

在数组中使用索引为数组的每个元素赋值。从010,将数据赋给数组的元素,如下所示:

A(0) = 256

A(1) = 324

A(2) = 100

A(10) = 55

与此类似,使用索引可以检索到所需的数组元素的数据。例如:

SomeVariable = A(8) 

数组并不仅限于一维。数组的维数最大可以为60(尽管大多数人不能理解超过34的维数)。声明多维数组时用逗号分隔括号中每个表示数组大小的数字。在下例中,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)

重新调整动态数组大小的次数是没有任何限制的,但是应注意:将数组的大小调小时,将会丢失被删除元素的数据。


第一章第二章第三章第四章第五章