VBScript函数中的变量范围

时间:2010-09-30 22:12:09

标签: vbscript scope

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

  1. Dim =本地范围,如果变量名称尚未全局存在(在这种情况下,它会重用全局变量!)
  2. Global =强制在全局范围内创建变量
  3. Local =强制在Local / Function范围中创建变量
  4. 想象一下,我有以下.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与仅使用它们定义变量有什么意义,这在脚本语言中是可能的?

1 个答案:

答案 0 :(得分:20)

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要使用的所有变量,并且可以节省您数小时的调试时间。