【问题标题】:Variable scope in VBScript functionsVBScript 函数中的变量范围
【发布时间】:2010-09-30 22:12:09
【问题描述】:

我对 VBScript 中的变量范围有疑问。我知道有以下关键字(来自autoitscript.com):

  1. Dim = 局部范围,如果变量名在全局尚不存在(在这种情况下,它会重用全局变量!)
  2. Global = 强制在全局范围内创建变量
  3. Lo​​cal = 强制在 Local/Function 范围内创建变量

假设我有以下 .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)strPathlocal 变量吗?或者函数/子程序是否可以访问在脚本主要部分顶部定义为 global 变量的strPath

另外,显式使用Dim 而不是在我使用它们时定义变量(这在脚本语言中是可能的)有什么意义?

【问题讨论】:

    标签: vbscript scope


    【解决方案1】:

    DisplayPath 过程中的strPath 将是一个新变量,但不是出于您期望的原因,您的代码存在细微问题,这会使问题变得模糊。

    调用Sub 过程时,VBScript 语法不包括括号。例如:-

    Sub MyProc(Param1, Param2)
      '' # Do stuff
    End Sub
    
    MyProc("Hello", "World")
    

    以上将导致语法错误。它应该被称为:-

    MyProc "Hello", "World"
    

    现在,当只有一个参数时,不会发生语法错误。这是因为括号的另一种用法是作为表达式的一部分,例如'(a + b) * c'。在这种情况下:-

    DisplayPath(strPath)
    

    VBScript 解析“表达式”(strPath) 并将 结果 传递给 DisplayPath。正是这个result产生了新的存储持有结果的表达式。

    你打电话了吗

    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 是否是全局的并且可以被脚本中的所有函数/子程序访问,即使我没有将它们作为局部函数变量传递。
    • 非常重要的观察,今天为我节省了一些时间!!
    • 关于括号的简单语法错误我很容易通过使用Call MyProc("Hello", "World")解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多