2010-09-30 60 views
9

我有一个关于VBScript中变量作用域的问题。我知道有以下关键字(从autoitscript.com):(!在这种情况下,重复使用全局变量)VBScript函数中的变量作用域

  1. 昏暗=本地范围如果变量名称不已经在全球范围存在
  2. 全球=部队创造的在全球范围内的变量
  3. 本地=强制创建的本地/功能范围

变量的想象一下,我有以下.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而不仅仅是定义变量,因为我使用它们,这在脚本语言中是可能的吗?

回答

20

strPathDisplayPath过程将是一个新的变量,但不是你期望的原因,你的代码有一个微妙的问题,将云问题。

当调用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

非常有帮助,+1,谢谢。我很高兴你澄清了通过引用和传递价值(以及创建新存储)之间的区别。但是,我还想知道的是,如果'strPath'是全局的,并且可以被脚本中的所有函数/子项访问,即使我不将它们作为本地函数变量传递。 – JohnB 2010-10-02 17:12:54

+1

@JohnB:看到我编辑的答案。 – AnthonyWJones 2010-10-02 17:34:57

+0

我明白你的意见,谢谢! – JohnB 2010-10-02 18:19:44