“变量”是计算机内存中已命名的存储位置,它包含数据,如数值或文本字符串。变量中包含的数据称为变量的“值”。变量使用有助于理解脚本功能的名称来存储、检索和管理值。
遵循下列脚本语言规则和原则来命名和声明变量。即使不要求在使用之前声明变量,但先声明变量的良好开发习惯将有助于减少错误。“声明”变量也就是告诉脚本引擎特定名称的变量已经存在,可以在脚本中引用此变量。
VBScript 不要求变量声明,但在使用之前先声明所有变量是一种良好的脚本编程习惯。可以使用 Dim、Public 或 Private 语句在 VBScript 中声明变量。例如:
<% Dim UserName %>
可以在 .asp 文件中使用 VBScript Option Explicit 语句,要求必须使用Dim、Private、Public 和 ReDim 语句显式声明变量。Option Explicit 语句必须位于任何 ASP 命令之后、任何 HTML 文本或脚本命令之前。此语句只影响使用 VBScript 编写的 ASP 命令;并不影响 JScript 命令。
<% Option Explicit %> <HTML> <% Dim strUserName Public lngAccountNumber %> . . .
有关这些命令的详细信息,请参阅 Windows Script Technologies 网站中的“VBScript 语言参考”。
虽然 JScript 通常不要求变量声明,但在使用之前先声明所有变量是一个良好的脚本编程习惯。可使用 var 语句声明变量。例如:
<% var UserName %>
通常,只有在需要将函数内部变量与在函数外部使用的“全局”变量区分开时,才有必要在 JScript 中声明变量。在这种情况下,如果不区分两个变量,JScript 会假定只引用全局变量。关于 var 语句的详细信息,请参阅 Windows Script Technologies 网站中的“JScript 语言参考”。
变量“范围”或生存期确定哪些脚本命令可以访问变量。在过程中声明的变量具有“局部范围”;每次执行过程时创建和消除此变量。无法从过程外部访问此变量。在过程外部声明的变量具有“全局范围”;ASP 网页中的任何脚本命令都可以访问和修改此变量值。
注意 将变量范围限制在过程中有利于提高性能。
声明变量时,局部变量和全局变量可以同名。修改其中一个变量的值,不会影响另一个变量。不过,如果不声明变量,则有可能在无意中修改全局变量的值。例如,在下例中虽然有两个变量 Y,但脚本命令返回值 1:
<%
Option Explicit
Dim Y
Y = 1
SetLocalVariable
Response.Write Y
Sub SetLocalVariable
Dim Y
Y = 2
End Sub
%>
与此相反,在下例中因为没有显式声明变量,所以脚本命令返回值 2。当过程调用设置 Y 为 2 时,脚本引擎认为过程要修改全局变量:
<%
Option Explicit
Dim Y = 1
SetLocalVariable
Response.Write Y
Sub SetLocalVariable
Y = 2
End Sub
%>
要避免此类问题的发生,有必要养成显式声明所有变量的习惯。这一点当使用 #include 语句在 .asp 文件中包含其他文件时尤其重要。被包含的脚本虽然在单独的文件中,但却当作是包含文件的一部分。除非声明变量,否则很容易忘记必须在主脚本和被包含脚本中使用不同的变量名。
全局变量只能在单个 .asp 文件内访问。要从单独网页外部访问变量,需提供变量的 Session 或 Application 作用域。Session 作用域变量对单个用户请求的 ASP 应用程序的所有页都可用。Application 作用域变量对任何用户请求的 ASP 应用程序的所有页都可用。Session 变量适用于存储单个用户的信息,如首选项、用户名或标识。应用程序变量适用于存储特定应用程序所有用户的信息,如应用程序需要的特定欢迎词或常规值。
ASP 提供了两种内置对象,您可以在其中存储变量:Session 对象和 Application 对象。
也可以用 Session 或 Application 作用域来创建对象实例。详细信息,请参阅设置对象作用域。
要给变量提供 Session 作用域,可通过给对象中已命名条目赋值将变量存储在 Session 对象中。例如,下列命令将在 Session 对象中存储两个新变量:
<%
Session("FirstName") = "Jeff"
Session("LastName") = "Smith"
%>
要从 Session 对象中检索信息,可使用输出命令 (<%=) 或 Response.Write 访问已命名的条目。下列示例使用输出命令显示 Session("FirstName") 的当前值:
Welcome <%= Session("FirstName") %>
可以在 Session 对象中存储用户首选项,然后通过访问这些首选项来确定将哪些页返回给用户。例如,可以允许用户在应用程序首页中指定只查看纯文本内容,然后将此项选择应用于用户在此应用程序中访问的所有后续页。
<%
strScreenResolution = Session("ScreenResolution")
If strScreenResolution = "Low" Then
%>
这是一个纯文本网页。
<% Else %>
这是一个多媒体网页。
<% End If %>
注意 如果在脚本中要多次引用 session 作用域变量,可以考虑如上例所示,将此变量赋给一个局部变量以便提高性能。
要提供变量 Application 作用域,可通过给对象中已命名条目赋值来将变量存储在 Application 对象中。例如,下列命令在 Application 对象中存储应用程序特定的欢迎词:
<% Application("Greeting") = "Welcome to the Sales Department!" %>
要从 Application 对象中检索信息,可使用 ASP 输出命令 (<%=) 或 Response.Write 来从应用程序中的任何后续页访问已命名的条目。下列命令使用输出命令来显示 Application("Greeting") 的值:
<%= Application("Greeting") %>
同样地,如果脚本重复引用 Application 作用域变量,应将此变量赋给全局变量以便提高性能。
“常量”是用来取代数值或字符串的名称。随 ASP 提供的部分基本组件,如 ActiveX 数据对象 (ADO),定义了可在脚本中使用的常量。组件可以在“组件类型库”中声明常量,组件类型库是一个包含 COM 组件支持的对象和类型的信息的文件。一旦在 .asp 文件中声明了类型库,就可以在同一 .asp 文件的所有脚本中使用已定义的常量。类似地,可以在 Global.asa 文件中声明类型库,以便在应用程序的所有 .asp 文件中使用已定义的常量。
要声明类型库,可以在 .asp 文件或 Global.asa 文件中使用 <METADATA> 标签。例如,要声明 ADO 类型库,可使用下列语句:
<!--METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library" TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}"-->
或者,如果不引用类型库的通用唯一标识符 (UUID),也可通过文件路径引用类型库:
<!-- METADATA TYPE="typelib" FILE="c:\program files\common files\system\ado\msado15.dll"-->
然后,即可在 .asp 文件中使用 ADO 常量,此文件声明了类型库或者驻留在包含 Global.asa 文件(声明了 ADO 类型库)的应用程序中。在下列例子中,adOpenKeyset 和 adLockOptimistic 是 ADO 常量:
<%
'创建并打开 Recordset 对象。
Set rstCustomerList = Server.CreateObject("ADODB.Recordset")
rstCustomerList.ActiveConnection = cnnPubs
rstCustomerList.CursorType = adOpenKeyset
rstCustomerList.LockType = adLockOptimistic
%>
下表列出了常用的类型库和 UUID:
| 类型库 | UUID |
|---|---|
| Microsoft ActiveX Data Objects 2.5 Library | {00000205-0000-0010-8000-00AA006D2EA4} |
| Microsoft CDO 1.2 Library for Windows 2000 Server | {0E064ADD-9D99-11D0-ABE5-00AA0064D470} |
| MSWC Advertisement Rotator Object Library | {090ACFA1-1580-11D1-8AC0-00C0F00910F9} |
| MSWC IIS Log Object Library | {B758F2F9-A3D6-11D1-8B9C-080009DCC2FA} |
关于 <METADATA> 标签的参考信息,请参阅 TypeLibrary 声明。
在以前版本的 ASP 中,部分组件以文件形式提供了常量定义,这些文件必须包含在使用这些常量的所有 ASP 文件中。虽然仍可以通过 #include 命令包含常量定义,但使用类型库更方便,也更容易升级脚本。在未来的 ASP 版本中,组件可能不提供常量定义文件。
注意 使用 <METADATA> 标签(而不是 #include 命令)可以提高 Web 应用程序的性能。
可以定义自己的常量。在 VBScript 中,使用 Const 语句。在 JScript 中,可以使用 var 语句将常量值赋给变量。如果要在多个 .asp 文件中使用常量,则需要将定义放在单独文件中,并在所有使用此常量的 .asp 文件中包含这些定义。