Dim变量(如果尚未Dim’);用VBScript/classicasp编程

Dim变量(如果尚未Dim’);用VBScript/classicasp编程,vbscript,asp-classic,Vbscript,Asp Classic,首先,我要说我讨厌VBScript/ASP,对它了解不多,但我不得不使用它,所以请容忍我。:-) 我有一个相当简单的页面,可以直接调用,也可以在其他页面中包含虚拟页面。让我们将此页面称为included.asp,并说它可能包含在main.asp中 included.asp使用一个变量,一个数组,如果可以,它应该从main.asp继承,但是如果直接调用它,我将在included.asp本身中定义它 因此,在main.asp的某个地方,会出现如下内容: Dim myVar(10) myVar(1)

首先,我要说我讨厌VBScript/ASP,对它了解不多,但我不得不使用它,所以请容忍我。:-)

我有一个相当简单的页面,可以直接调用,也可以在其他页面中包含虚拟页面。让我们将此页面称为included.asp,并说它可能包含在main.asp中

included.asp使用一个变量,一个数组,如果可以,它应该从main.asp继承,但是如果直接调用它,我将在included.asp本身中定义它

因此,在main.asp的某个地方,会出现如下内容:

Dim myVar(10)
myVar(1) = "Some content here"
(对我来说)在include.asp中定义变量(如果不存在继承变量)的明显方式如下:

If IsEmpty(myVar) Then
  Dim myVar(10)
  myVar(1) = "Some content here"
End If
但这对我没什么好处。我在included.asp中的行中得到一个错误800a0411“Name redefined”,我试图
Dim
变量“reach”。此后,我尝试了
If VarType(myVar)<8000
(从数组开始;在包含页面时输出其VarType会得到8194)和
If Not IsArray(myVar)
,结果相同

现在,我不知道这是一个编译器错误还是一个运行时错误(我也不知道如何区分VBScript中的差异),但是由于错误被抛出到
if
块中,当定义
myVar
时,不应该执行该块,我猜这是一个编译器错误。称它(错误1041)为语法错误,我想这意味着它至少在编译时抛出,而不是在运行时抛出

因此,如果这确实是一个编译器错误,并且无论实际的
Dim
语句是否可能执行多次,都不可能在VBScript代码中的任何位置多次
Dim
相同的变量名,那么如何处理这种情况呢


我怎样才能测试一个变量是否已经被设置了
Dim
,然后
Dim
只有当它没有被设置时,我才能测试它?我避免这样做的原因正是你遇到的。没有很多好的选择可以给你带来你想要的灵活性

建议1是重构代码,使包含的文件不依赖于任何全局变量。可以将数组作为参数传递给包含文件中的函数。在这样做的同时,采取一种策略,即以后永远不要创建这些依赖项。:-)

建议2a是要求包含include.asp的任何页面必须
dim
它所期望的全局值(这不是一个好办法;可能只是在文件顶部添加一条大注释)。要修复直接使用included.asp而不包含在其他地方的情况,请创建另一个文件,例如included_standalone.asp,该文件声明所需的globals和included.asp。使用新的included_standalone.asp,无论您在何处单独使用included.asp

建议2b类似:将included.asp的内容移动到另一个文件中,比如included_contents.asp,然后更改included.asp,以便它声明全局文件并包含included_contents.asp。然后,在声明和初始化全局变量后,更改用于包含include.asp和include_contents.asp的所有位置


一旦你接受了ASP的局限性,它就没那么糟糕了。如果你试图把它变成它不是的东西,你只会沮丧地走出来。:-)

为什么不在include.asp中的任何地方使用一个不同的变量来显示它,并在它有值时将其值赋给myVar?@mjw我想我可以这样做,但它感觉像是一个丑陋而混乱的黑客。包含的文件包括其他文件,其中一些文件也包含在不同的文件中。我不知道这些包含的其他文件是否依赖于
myVar
,但它们可能…在这种情况下,我必须检查这些文件中是否设置了
myVar
myOtherVar
,可能会为同样的事情创建第三个变量。我很想避免那样,这很公平。如果你必须重新确定数组的尺寸,你可以使用
ReDim myArr(size)
,我相信即使你从一开始就没有对数组进行过尺寸调整,它也会飞起来……但是,如果你
ReDim preserve
(保留数组的原始内容),我想它可能会抱怨,所以请测试一下,看看这是否能满足你的需要。是的,包含不是asp功能,而是IIS功能。IIS将页面合并在一起,然后将总结果传递给ASP处理器。这就是为什么黑暗会出现两次。这也是为什么不能使用if语句执行条件include。查看WSC的条件可重用ASP代码。遗憾的是,建议1在这里不可行(大约有10000个文件散布在一个令人麻木的不合逻辑的文件系统中,我不知道有多少文件称此文件),但只有少数地方将此文件用作独立文件,因此,建议2a是一个优秀而优雅的解决方案,不知何故,我完全没有考虑它!这是一个很好的例子,说明了对某个特定问题的思考过于狭隘会使您看不到一个明显的解决方案。我不知道这是一件好事情还是一件坏事情,因为我善于使用ASP.:-)大约20年前,我在一个电子商务网站上继承了一堆糟糕的ASP代码,我每个月都会在其中呆上几次;也许一年两到三次来做重大改变。我从来没有数过档案;看起来大约1500。我在Mac电脑上编辑,我的源代码管理系统(Vault)会将网站上的副本保持为最新版本。我可以用我的编辑器(BBEdit)搜索我的所有文件,因此我可以在使用“included.asp”的任何地方找到它。:-)这里基本相同:电子商务网站继承了以前的开发者。总共约80 GB的文件(混合了代码文件、PDF和图像),loca