Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Рекурсия перезаписывает локальные переменные! Почему? (https://javascript.ru/forum/misc/27030-rekursiya-perezapisyvaet-lokalnye-peremennye-pochemu.html)

salikoff 31.03.2012 19:45

Рекурсия перезаписывает локальные переменные! Почему?
 
function processFolder(oSource, strTarget)
	{
	for (var ext in extArray)
		{
		var source = oSource.Path + "\\*." + extArray[ext];
		try {fso.CopyFile(source, strTarget)} catch(e) {}
		}
	var subFolders = new Enumerator(oSource.SubFolders);
	for (; !subFolders.atEnd(); subFolders.moveNext())
		{
		var target = strTarget + "\\" + subFolders.item().Name;
		processFolder(subFolders.item(), target)	
		}
	}

При рекурсивном вызове функции processFolder локально объявленные переменные subFolders и source перезаписываются и, соответственно, весь алгоритм рушится. Почему так происходит? Ведь явно указано var перед определением переменной. Как этого избежать? Ничего не понимаю. Прошу вашего совета, дамы и господа.

Раед 31.03.2012 21:13

замените все subFolders на processFolder.subFolders и уберите var

salikoff 31.03.2012 22:01

Рекомендуемый Вами приём ровным счётом ничего не меняет, локальная переменная всё равно перезаписывается.

salikoff 31.03.2012 22:03

Попробовал ещё одно ухищрение — рекурсивный вызов через arguments.callee. Ситуация не изменилась.

salikoff 31.03.2012 22:07

вот более полная версия скрипта, для тех, кто хочет запустить его на исполнение:
extArray =["txt","doc","docx","xls","xlsx"];
strTarget = "D:\\target";
sourceArray = ["E:"];
fso = new ActiveXObject("Scripting.FileSystemObject");

if (fso.FolderExists(strTarget)) fso.GetFolder(strTarget).Delete(true);
fso.CreateFolder(strTarget);


function processFolder(oSource, strTarget)
	{
	for (var ext in extArray)
		{
		var source = oSource.Path + "\\*." + extArray[ext];
		try {fso.CopyFile(source, strTarget)} catch(e) {}
		}
	var subFolders = new Enumerator(oSource.SubFolders);
	for (; !subFolders.atEnd(); subFolders.moveNext())
		{
		var target = strTarget + "\\" + subFolders.item().Name;
		processFolder(subFolders.item(), target)	
		}
	}	

function processFolders(sourceArray, strTarget)
	{
	for (var index in sourceArray)
		{
		folder = fso.GetFolder(sourceArray[index]);	
		processFolder(folder, strTarget)
		}	
	}	
	
processFolders(sourceArray,strTarget);

Сканируются папки указанные в массиве sourceArray на предмет наличия в них файлов с указанными расширениями. Найденные файлы перемещаются в папку target

salikoff 31.03.2012 23:43

Проблема решена. Рекурсия работает правильно, локальные переменные сохраняются. Ошибка была в другом месте — функция CopyFile не копирует файл, если папка назначения не существует.


Часовой пояс GMT +3, время: 22:18.