如果尚未在VBScript /经典ASP

时间:2018-07-02 16:39:43

标签: vbscript asp-classic

首先让我说我讨厌VBScript / ASP,对此我不太了解,但是我被迫使用它,所以请多多包涵。 :-)

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

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

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

Dim myVar(10)
myVar(1) = "Some content here"

(对于我而言)在 included.asp 中定义变量(如果不存在的话)的明显方法是:

If IsEmpty(myVar) Then
  Dim myVar(10)
  myVar(1) = "Some content here"
End If

但这对我没有多大帮助。在 included.asp 的行中,我尝试Dim变量“再次”时收到错误800a0411“名称已重新定义”。此后,我尝试使用If VarType(myVar) < 8000(由于数组have a VarType value of > 8192;在包含页面时输出其VarType会产生8194)和If Not IsArray(myVar),但结果相同。

现在,我不知道这是编译器错误还是运行时错误(我也不知道如何分辨VBScript中的差异),但是由于错误被抛出在If块内,因此应该(?)永远不会在定义myVar时执行,我猜这是编译器错误。 This Microsoft page将此错误(错误1041)称为语法错误,我认为这至少是在编译时而不是在运行时抛出的。

因此,如果确实是编译器错误,并且在Dim中使用相同的变量名在VBScript代码中的 anywhere 处不能多次出现-无论实际的{{1} }语句可能多次执行,那么如何处理这种情况?

我如何才能测试变量是否已经Dim,然后Dim(仅在尚未变量时)?

1 个答案:

答案 0 :(得分:3)

出于您遇到的原因,我避免做这样的事情。没有很多好的选择可以让您拥有想要的灵活性。

建议1是重构代码,以使包含的文件不依赖于任何全局变量。也许将数组作为参数传递给包含文件中的函数。与此同时,采用一种将来不再创建依赖关系的策略。 :-)

建议2a将要求任何包含 included.asp 的页面都必须dim它期望的全局变量(没有很好的方法来实施;可能只是在文件顶部)。要解决直接使用 included.asp 而没有将其包含在其他位置的情况,请创建另一个文件,例如 included_standalone.asp ,该文件声明所需的全局变量并包含 included.asp 。在您自己曾经单独使用过 included.asp 的任何地方使用新的 included_standalone.asp

建议2b相似:将 included.asp 的内容移动到另一个文件中,例如 included_contents.asp ,然后更改 included.asp 以便声明全局变量并包含 included_contents.asp 。然后,在声明并初始化全局变量之后,更改以前包含 included.asp 并包含 included_contents.asp 的所有地方。

一旦您接受了它的限制,

ASP就不是那么糟糕。如果您试图将其变成不是它的东西,您只会感到沮丧。 :-)