看看Ma,即使Option Explicit有效,我也可以重新定义全局变量 - 但为什么呢?

时间:2013-06-26 09:22:21

标签: vbscript

这是一个不错的疯狂发现:

Option Explicit

ExecuteGlobal "Option Explicit: Dim TestVar: TestVar=41"
ExecuteGlobal "Option Explicit: TestVar=42"

MsgBox "TestVar=" & CStr (TestVar)

按预期工作 - 显示42。

Option Explicit

ExecuteGlobal "Option Explicit: TestVar: TestVar=41"

MsgBox "TestVar=" & CStr (TestVar)
由于未定义TestVar,

在ExecuteGlobal调用中产生“未定义的变量”。 确定。

我所做的明白这一点:

Option Explicit

ExecuteGlobal "Option Explicit: Dim TestVar: TestVar=41"
ExecuteGlobal "Option Explicit: Dim TestVar: TestVar=42"

MsgBox "TestVar=" & CStr (TestVar)

在第二个ExecuteGlobal来电中抛出“标识符已重新定义”,但显示42 - 好像第二个Dim来电中的ExecuteGlobal一样不在场。

如果你对Class声明做同样的事情,一切正常,即你无法在任何情况下重新定义一个类。

到底是什么?

我的问题是:为什么ExecuteGlobal允许我重新定义一个全局变量,而a)ExecuteGlobal禁止访问未声明的变量,b)类定义被区别对待?

我确实有一个导致这种情况的用例(在测试运行时生成源代码并通过ExecuteGlobal执行它以获得一些不那么奇怪的,因为你可能期望的原因),但我刚刚提出的观点是有效的我认为没有对现实世界的描述。

我使用QTP(HP QuickTest Professional)来解决这个问题,它使用VisualBasic脚本主机引擎进行脚本回放,但它只与VB脚本主机完全相同。

1 个答案:

答案 0 :(得分:6)

以下代码

Option Explicit 
    ExecuteGlobal "WSCript.Echo b "

不会失败。 executeglobal的上下文不知道声明的Option explicit。但

Option Explicit 
    ExecuteGlobal "Option Explicit : WSCript.Echo b "

因运行时错误而失败。每个人都在工作,但在一个单独的环境中。和

Option explicit
    Dim b
    ExecuteGlobal "Option Explicit : WScript.Echo b "

按预期工作。

在以下代码中

Option Explicit 
    ExecuteGlobal "Option Explicit: Dim a : a = 1 : Dim a : a = 2"

您将收到重新定义的名称错误。这是编译器错误,而不是运行时错误。

如上所述,如果对类

执行相同操作
Option Explicit 
    Class thisThing
    End Class

    ExecuteGlobal "class thisThing : End Class"

您收到运行时错误,重新定义了名称。

因此,从您的测试和这些测试(以及更多),它“似乎”ExecuteGlobal生成一个新的上下文,在执行传递的代码时在其中工作,并在退出时,上下文与原始调用上下文合并。

所以,回答你的问题:

a)如果变量在不同的上下文中完成,则可以“重新定义”变量。合并变量值。

b)如果在ExecuteGlobal上下文中使用了explicit explicit,则ExecuteGlobal不允许访问未定义的变量。

c)变量是变量。值可以在ExecuteGlobal上更改,并在退出时合并。但是,类重新定义正在改变某些东西,而不是所谓的东西。

我没有反编译VBScript引擎,但这似乎与观察到的行为一致。

相关问题