5

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

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)

在 ExecuteGlobal 调用中产生“未定义的变量”,因为未定义 TestVar。好的。

明白的是:

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 脚本主机中情况完全相同。

4

1 回答 1

6

以下代码

Option Explicit 
    ExecuteGlobal "WSCript.Echo b "

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

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 ,则 ExecuteGlobal 不允许访问未定义的变量。

c) 变量是变量。值可以在 ExecuteGlobal 上更改,并在退出时合并。但是类的重新定义正在改变某物是什么,而不是某物包含什么。

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

于 2013-10-18T09:15:24.177 回答