Область видимости переменной в функциях VBScript

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

Dim = локальная область, если имя переменной еще не существует глобально (в этом случае она повторно использует глобальную переменную!)Global = принудительно создает переменную в глобальной области видимости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

В функции:DisplayPath(strPath), являетсяstrPath a местный переменная? Или функции / сабы имеют доступ кstrPath определяется в верхней части основного раздела скрипта какГлобальный переменная?

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

Ответы на вопрос(1)

Решение Вопроса

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

 JohnB02 окт. 2010 г., 20:19
Я понимаю вашу точку зрения с опечаткой, спасибо!
 JoeKir26 июл. 2013 г., 22:52
Очень важное наблюдение, сэкономило мне время сегодня !!
 Lankymart28 мая 2014 г., 12:01
Простые синтаксические ошибки, касающиеся скобок, которые я легко решаю, используяCall MyProc("Hello", "World").
 AnthonyWJones02 окт. 2010 г., 19:34
@JohnB: см. Мой отредактированный ответ.
 JohnB02 окт. 2010 г., 19:12
очень полезно, +1, спасибо. Я рад, что вы прояснили это различие между передачей по ссылке и передачей по значению (и созданию нового хранилища). Тем не менее, то, что я также хочу знать, это еслиstrPath является глобальным и доступен всем функциям / подпрограммам в скрипте, даже если я не передаю их как локальные переменные функции.

Ваш ответ на вопрос