这是一个不错的疯狂发现:
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脚本主机完全相同。
答案 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引擎,但这似乎与观察到的行为一致。