这是一个很好的疯狂发现:
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脚本主机完全相同.
以下代码
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引擎,但这似乎与观察到的行为一致.
| 归档时间: |
|
| 查看次数: |
1000 次 |
| 最近记录: |