如果在 VBScript / Classic 中尚未变暗,则变暗变量 ASP

Dim variable if not already dim’ed in VBScript / Classic ASP

首先让我说我讨厌 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 中的行中收到错误 800a0411“名称重新定义”,我尝试 Dim 变量“再次”。我已经尝试使用 If VarType(myVar) < 8000(因为数组 have a VarType value of > 8192;当包含页面时输出其 VarType 给出 8194)和 If Not IsArray(myVar) 而不是,结果相同。

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

所以如果确实是编译器错误,并且在 VBScript 代码中 anywhere 不可能多次 Dim 同一个变量名——不管是否实际的 Dim 语句可能会被多次执行——那么如何处理这种情况呢?

我如何测试一个变量是否已经被 Dim 编辑,然后 Dim 只有在没有的情况下才测试它?

出于您 运行 的原因,我避免做这样的事情。没有太多好的选择可以为您提供您想要的灵活性。

建议 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 一旦你接受了它的局限性,它并没有那么糟糕。如果你试图把它变成它不是的东西,你只会感到沮丧。 :-)