gpt4 book ai didi

vbscript - 看,马,即使 Option Explicit 处于事件状态,我也可以重新定义全局变量 - 但为什么呢?

转载 作者:行者123 更新时间:2023-12-03 06:39:12 26 4
gpt4 key购买 nike

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

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 调用中会产生“ undefined variable ”。 好的。

理解的是:

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

最佳答案

以下代码

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 上下文中使用显式选项,则 ExecuteGlobal 不允许访问 undefined variable 。

c) 变量就是变量。值可以在 ExecuteGlobal 上更改,并在退出时合并。但类的重新定义正在改变事物的本质,而不是事物所包含的内容。

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

关于vbscript - 看,马,即使 Option Explicit 处于事件状态,我也可以重新定义全局变量 - 但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com