Область видимости переменной в функциях VBScript - PullRequest
10 голосов
/ 01 октября 2010

У меня есть вопрос о области видимости переменной в VBScript.Я знаю, что есть следующие ключевые слова (из autoitscript.com ):

  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), strPath локальная переменная?Или функции / подпрограммы имеют доступ к strPath, определенному в верхней части основного раздела скрипта как глобальная переменная?

Кроме того, какой смысл явноиспользование Dim вместо простого определения переменных при их использовании, что возможно в языках сценариев?

1 Ответ

20 голосов
/ 02 октября 2010

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 использовать все переменные и сэкономит вам часы отладки.

...