VBScript函数中的变量范围

Joh*_*hnB 10 vbscript scope

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

  1. 如果变量名称不是全局存在的话,Dim = Local scope(在这种情况下,它会重用全局变量!)
  2. Global =强制在全局范围内创建变量
  3. Local =强制在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
Run Code Online (Sandbox Code Playgroud)

在功能:DisplayPath(strPath)strPath一个局部变量?或者函数/ subs是否可以访问strPath脚本主要部分顶部定义的全局变量?

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

Ant*_*nes 20

strPathDisplayPath过程将是一个新的变量,但不是你所期望的原因,有一个与你的代码微妙的问题,将模糊焦点.

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

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

MyProc("Hello", "World")
Run Code Online (Sandbox Code Playgroud)

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

MyProc "Hello", "World"
Run Code Online (Sandbox Code Playgroud)

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

DisplayPath(strPath)
Run Code Online (Sandbox Code Playgroud)

VBScript解析"表达式" (strPath)并将结果传递给DisplayPath.这个结果产生了新的存储保持结果的表达.

如果你打电话给

DisplayPath strPath
Run Code Online (Sandbox Code Playgroud)

没有新的创造.

然而呢: -

Sub DisplayPath(something)
  MsgBox something
End Sub
Run Code Online (Sandbox Code Playgroud)

仍然没有分配新的存储空间. something将指向相同的记忆strPath.

编辑

以下代码有效: -

Dim strPath

strPath = "c:\folder"

Display


Sub Display()
  MsgBox strPath
End Sub
Run Code Online (Sandbox Code Playgroud)

strPath程序外部的声明使其具有全球范围.

至于使用显式Dim如果上面的赋值行看起来像这样会发生什么?

 strPath = "c:\folder"
Run Code Online (Sandbox Code Playgroud)

一个名为的新变量strPath将会出现并strPath保持为空.您应该始终使用以下行开始您的VBScript文件: -

Option Explicit
Run Code Online (Sandbox Code Playgroud)

这将强制您显式使用Dim所有变量,并节省您数小时的调试时间.

  • 关于括号的简单语法错误我可以通过使用`Call MyProc("Hello","World")来轻松解决. (2认同)