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

The*_*One 5 vbscript

这是一个很好的疯狂发现:

Option Explicit

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

MsgBox "TestVar=" & CStr (TestVar)
Run Code Online (Sandbox Code Playgroud)

按预期工作 - 显示42.

和:

Option Explicit

ExecuteGlobal "Option Explicit: TestVar: TestVar=41"

MsgBox "TestVar=" & CStr (TestVar)
Run Code Online (Sandbox Code Playgroud)

由于未定义TestVar,因此在ExecuteGlobal调用中产生"未定义的变量".好.

明白的是:

Option Explicit

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

MsgBox "TestVar=" & CStr (TestVar)
Run Code Online (Sandbox Code Playgroud)

不会扔在第二"标识符重新定义" ExecuteGlobal呼叫,但显示42 -如同Dim在第二ExecuteGlobal呼叫中不存在.

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

我勒个去?

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

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

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

MC *_* ND 6

以下代码

Option Explicit 
    ExecuteGlobal "WSCript.Echo b "
Run Code Online (Sandbox Code Playgroud)

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

Option Explicit 
    ExecuteGlobal "Option Explicit : WSCript.Echo b "
Run Code Online (Sandbox Code Playgroud)

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

Option explicit
    Dim b
    ExecuteGlobal "Option Explicit : WScript.Echo b "
Run Code Online (Sandbox Code Playgroud)

按预期工作.

在以下代码中

Option Explicit 
    ExecuteGlobal "Option Explicit: Dim a : a = 1 : Dim a : a = 2"
Run Code Online (Sandbox Code Playgroud)

您将获得重新定义的名称错误.这是编译器错误,而不是运行时错误.

如果指出,你对类做同样的事情

Option Explicit 
    Class thisThing
    End Class

    ExecuteGlobal "class thisThing : End Class"
Run Code Online (Sandbox Code Playgroud)

你得到一个运行时错误,重新定义名称.

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

那么,回答你的问题:

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

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

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

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