VBScript 函数中的变量范围

2024-03-06

我有一个关于 VBScript 中变量范围的问题。我知道有以下关键字(来自autoitscript.com http://www.autoitscript.com/autoit3/docs/keywords/Dim.htm):

  1. Dim = 本地范围,如果变量名称尚不存在于全局(在这种情况下,它会重用全局变量!)
  2. Global = 强制在全局范围内创建变量
  3. Local = 强制在本地/函数范围内创建变量

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

另外,显式使用有什么意义Dim与在使用变量时定义变量相比,这在脚本语言中是可能的吗?


The strPath in the DisplayPathprocedure 将是一个新变量,但不是出于您期望的原因,您的代码存在微妙的问题,这将使问题变得模糊。

打电话时SubVBScript 语法不包含括号。例如:-

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

MyProc("Hello", "World")

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

MyProc "Hello", "World"

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

DisplayPath(strPath)

VBScript解析“表达式”(strPath)并通过result to DisplayPath。是这个result这会产生新的存储来保存表达式的结果。

你打电话给

DisplayPath strPath

没有新创建。

然而这个又如何呢:-

Sub DisplayPath(something)
  MsgBox something
End Sub

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

Edit

下面的代码有效:-

Dim strPath

strPath = "c:\folder"

Display


Sub Display()
  MsgBox strPath
End Sub

的声明strPath在过程之外导致它具有全局范围。

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

 strPath = "c:\folder"

一个新变量称为strPath将出现并且strPath将保持空白。你应该always以以下行开始 VBScript 文件:-

Option Explicit

这将迫使你明确地Dim要使用的所有变量,将为您节省数小时的调试时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VBScript 函数中的变量范围 的相关文章

随机推荐

  • 从 YouTube ClientLogin 迁移到 OAuth 2.0

    我有一个应用程序 可以将视频上传到 YouTube 的特定 YouTube 频道 也就是说 不是上传到任何单个用户的频道 而是上传到单个频道 我有该频道的用户名和密码 在 ClientLogin 中 我的服务器端进程向 YouTube 提供
  • 由此生成了多少个Java对象 - new String("abcd")

    String s new String abcd 实习生池中有一个字符串 每次运行代码时都会重复使用该字符串 然后是每次运行该行时都会构造的额外字符串 例如 for int i 0 i lt 10 i String s new String
  • 如何根据azure命令的输出在powershell中分割字符串

    我有一个正在尝试编写的 powershell 脚本 我需要从控制台获取一些输入 输出并将其通过管道传输到分割命令中 但我不知道如何操作 我正在运行 azure cli 命令 来列出一堆资源 我需要提取存储帐户的名称 这是一些示例输出 Nam
  • 已发布的 ASP.NET Core 站点上出现错误:找不到包“Microsoft.AspNet.WebApi.Client”的编译库位置

    我的 Web 应用程序在从 Visual Studio 运行时工作正常 但当我发布并尝试加载页面时 我得到 InvalidOperationException 找不到包 Microsoft AspNet WebApi Client 的编译库
  • 如何从java中的int中获取最高有效的n位

    我有一个 int 我想获得 java 中的 19 个最高有效位 我尝试了各种方法 但没有一个有效 有人可以帮帮我吗 添加布拉姆的答案 你甚至不需要AND如果您使用无符号移位 myInt gt gt gt 13 将为您提供 19MSB 尽管它
  • 将 UIViewController 视图属性设置为没有故事板/笔尖的自定义 UIView 类

    我有一个UIViewController called LoginViewController 我想建立这样的观点LoginViewController 完全以编程方式在一个习惯中UIView类称为LoginView而不是在我的内部构建所有
  • C++ 使用 unicode 名称保存文件问题 - 如何以跨平台方式正确保存 UTF-8 文件名?

    我想保存一个带有名称的文件 jpg我收到一个字符串 例如从文件中读取 其中包含 unicode 但我的 C 代码将其保存为 jpg我该怎么做才能正确保存它 顺便说一句 如果我只是将该字符串保存到文件中 它会正确保存 这意味着只有我保存文件名
  • 短到十六进制字符串

    有方法Integer toHexString and Long toHexString 由于某种原因他们没有实施Short toHexString 将 Short 转换为十六进制字符串的规范方法是什么 无法使用Integer toHexSt
  • 将嵌套数组简化为单级数组[重复]

    这个问题在这里已经有答案了 可能的重复 如何展平多维数组 https stackoverflow com questions 1319903 how to flatten a multidimensional array 假设我有一个这样的
  • SonarQube:一天有多少小时的技术债务?

    如果 SonarQube 说我在某个项目中有 1 天的技术债务 那么这是否会转化为 24 小时的技术债务或 8 小时的技术债务 从几小时到几天的转换是可定制的 默认情况下为 8 小时 但您可以通过转至管理 gt 配置 gt 技术债务来找到您
  • 查找不是父/祖父母/等或子/孙/等的所有链接对象的算法

    我有一个名为Device A Device可以有一位家长 Device A Device还可以有n child Devices 我有一个下拉列表 显示所有可选的Devices 我可以获得所有Devices很容易在数据库中 db Device
  • 在 Scala 中使用 @BeanProperty 而不是定义 getter/setter 函数是一个好习惯吗?

    在类中定义可以公开访问 修改的数据成员 var foo Int def foo foo Int foo foo setter function def foo foo getter function 使用注释转换它是一个好习惯吗 BeanP
  • 如何更改Resharper的字体大小?

    如何更改Resharper的字体大小 我发现文件结构 实时模板和其他 UI 组件的字体小得难以忍受 我找不到任何自定义字体大小的选项 我尝试将 Windows DPI 增加到 150 这确实有效 但会导致很多其他问题 我正在使用 Resha
  • 为定制 RISC-V imafd SOC 移植 Linux

    我正在尝试构建一个 yocto演示 coreip cli我的自定义 risc v SOC 的图像仅支持imafd指示 对于 Bitbake 使用的交叉工具链的编译 我尝试更改 openembedded core 层中的 cross binu
  • Three.js 使用 WebRTC 并应用 Shader

    我不知道如何将着色器应用于具有视频纹理的 Three js 对象 我一直在使用 webRTC 和 Three js 并使用标准材质成功将视频纹理映射到网格上 var material new THREE MeshBasicMaterial
  • 使用 SimpleAdapter 过滤 listView 数据

    我需要帮助才能使过滤发挥作用 ListView 显示正确 但是当我在搜索字段中输入字母时出现错误 java lang NullPointerException 并且应用程序关闭 这是我的活动中的代码片段 我认为我必须修复它 但不知道如何修复
  • Android 计费 v3 - 无签名

    我想要的是 检索所有购买的商品后 我需要在服务器上验证购买情况 我想使用从应用内付款收到的签名和签名数据来完成此操作 首先 我使用了应用内计费 v2 每次使用我的开发者帐户都会获得静态测试 sku 的正确签名和签名数据android tes
  • 如何在 Katalon Studio 中读取 Excel 工作表中的数据

    我可以知道如何从 Katalon Studio 中的 Excel 工作表中读取数据 以便从文件中读取 API 端点以检查其输出吗 如何在 java 中编写代码以使 URL 运行并验证来自 API 端点的响应 我已经创建了一个示例项目 htt
  • 是否可以使用 SSE 对此嵌套进行矢量化?

    我从来没有为 SSE 优化编写过汇编代码 如果这是一个菜鸟问题 我很抱歉 在this https felix abecassis me 2012 08 sse vectorizing conditional code 文章解释了如何向量化f
  • VBScript 函数中的变量范围

    我有一个关于 VBScript 中变量范围的问题 我知道有以下关键字 来自autoitscript com http www autoitscript com autoit3 docs keywords Dim htm Dim 本地范围 如