Существует два способа передачи аргументов: по значению и по ссылке. Когда аргумент передается по значению, подпрограмма делает «копию» значения аргумента, поэтому, если подпрограмма эту копию изменяет, никаких проблем не возникает. Когда же аргумент передается по ссылке, изменения могут проделать путь назад к вызывающей процедуре, если значение является переменной, а не выражением. В VBScript имеется возможность явного объявления аргументов как переданных по значению — byval или как переданных по ссылке — bynef; по умолчанию в VBScript используется объявление bynef, поэтому если мы не добавим в определение подпрограммы CneateFullPath ключевое слово byval, изменения, производимые с path, отразятся на переменной вызывающей процедуры. В данной подпрограмме лучше указать byval, чтобы изменения не могли передаваться обратно. В нашем примере это особой роли не играет, но если подпрограмма CneateFullPath будет использоваться в других сценариях, то может и сыграть.
Следует заметить, что в JScript такой вопрос не возникает, потому что там все аргументы всегда передаются по значению.
Как все это работает? Подпрограмма CneateFullPath использует метод GetPanentFoldenName для получения имени папки, которая располагается Выше Указанной в пути папки более низкого уровня, то есть имени родительской папки, и если такая папка отсутствует, создает сначала эту папку. Только потом, и только если это необходимо, создается последняя указанная в пути папка. Весь секрет этой подпрограммы заключается в способе создания родительской папки: для этого она вызывает саму себя. Таким образом, подпрограмма CneateFullPath применяет точно такую же технологию для обеспечения существования той папки, которая находится выше родительской и так далее, вплоть до корневой папки.