VBScript函数中的变量范围

VBScript函数中的变量范围,vbscript,scope,Vbscript,Scope,我对VBScript中的变量范围有一个问题。我知道有以下关键词(来自): Dim=局部范围,如果变量名在全局范围内不存在(在这种情况下,它将重用全局变量!) Global=强制在全局范围内创建变量 局部=强制在局部/函数范围内创建变量 假设我有以下.vbs文件: Dim strPath strPath = "C:\folder" DisplayPath strPath Sub DisplayPath(strPath) 'Does this strPath get it's own loca

我对VBScript中的变量范围有一个问题。我知道有以下关键词(来自):

  • Dim=局部范围,如果变量名在全局范围内不存在(在这种情况下,它将重用全局变量!)
  • Global=强制在全局范围内创建变量
  • 局部=强制在局部/函数范围内创建变量
  • 假设我有以下.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
    与仅在脚本语言中定义变量相比有什么意义?

    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 strPath
    
    没有新的创建

    然而,这又如何呢:-

    Sub DisplayPath(something)
      MsgBox something
    End Sub
    
    仍然没有分配新的存储<代码>某些内容将指向与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
    是否是全局的,并且脚本中的所有函数/子函数都可以访问,即使我没有将它们作为局部函数变量传入。非常重要的观察,今天为我节省了一些时间!!关于括号的简单语法错误,我可以使用
    调用MyProc(“Hello”,“World”)
    轻松解决。