VBScript函数中的变量作用域
问题描述:
我有一个关于VBScript中变量作用域的问题。我知道有以下关键字(从autoitscript.com):(!在这种情况下,重复使用全局变量)VBScript函数中的变量作用域
- 昏暗=本地范围如果变量名称不已经在全球范围存在
- 全球=部队创造的在全球范围内的变量
- 本地=强制创建的本地/功能范围
变量的想象一下,我有以下.vbs文件:
Dim strPath
strPath = "C:\folder"
DisplayPath strPath
Sub DisplayPath(strPath) 'Does this strPath get it's own local scope?
MsgBox strPath
End Sub
在功能:DisplayPath(strPath)
,是strPath
一个当地变量?或者功能/潜艇是否可以访问在脚本主要部分顶部定义的strPath
作为全球变量?
另外,明确使用Dim
而不仅仅是定义变量,因为我使用它们,这在脚本语言中是可能的吗?
答
strPath
在DisplayPath
过程将是一个新的变量,但不是你期望的原因,你的代码有一个微妙的问题,将云问题。
当调用Sub
过程时,VBScript语法不包括括号。例如: -
Sub MyProc(Param1, Param2)
'' # Do stuff
End Sub
MyProc("Hello", "World")
以上会导致语法错误。它应该被称为: -
MyProc "Hello", "World"
现在,当只有一个参数时,不会出现语法错误。这是因为括号的另一个用法是作为表达的一部分,例如'(a + b)* c'。在的情况下: -
DisplayPath(strPath)
VBScript的解析 “表达” (strPath)
和传递结果DisplayPath
。它的这个结果产生了新的存储结果表达式。
要是你
DisplayPath strPath
没有新创建一个名为。
但是你看这个: -
Sub DisplayPath(something)
MsgBox something
End Sub
还有没有分配新的存储。 something
将指向与strPath
相同的内存。
编辑
下面的代码工作: -
Dim strPath
strPath = "c:\folder"
Display
Sub Display()
MsgBox strPath
End Sub
strPath
之外的程序的声明导致它具有全局范围。
至于使用显式Dim
这一点,如果上面的赋值行看起来像这样会发生什么?
strPath = "c:\folder"
一个名为strPath
新变量将生效的存在和strPath
将保持为空。你应该总是开始您的VBScript文件与线: -
Option Explicit
这将迫使你明确Dim
要使用的所有变量,将节省你的调试时间小时。
非常有帮助,+1,谢谢。我很高兴你澄清了通过引用和传递价值(以及创建新存储)之间的区别。但是,我还想知道的是,如果'strPath'是全局的,并且可以被脚本中的所有函数/子项访问,即使我不将它们作为本地函数变量传递。 – JohnB 2010-10-02 17:12:54
@JohnB:看到我编辑的答案。 – AnthonyWJones 2010-10-02 17:34:57
我明白你的意见,谢谢! – JohnB 2010-10-02 18:19:44