mark: javascript - Variable Scope - Recursion - Problem

Beitrag lesen

Hallo,

ich habe ein Problem mit Variable Scope in Zusammenhang mit einer Rekursiven Funktion. Ich durchsuche rekursiv Unterverzeichnisse nach einer Datei und speichere bei einem Match den vollständigen Pfad in ein Array. Leider stehe ich ziemlich auf der Leitung, wenn ich das Ganze ohne globale Variable "matches" abbilden will.

Folgende zwei Beispiele dienen nur der illustration meiner Gedankengänge. Korrigiert mich, wenn ich falsch liege, aber:

  • A funktioniert nicht, weil ich durch die Rekursion, durch den erneuten Funktionsaufruf jedesmal eine neue, leere Variable matches habe. Is klar.
  • B funktioniert nicht, weil die Variable/Funktion "recursion" noch nicht definiert ist, wenn ich sie inmitten ihrer selbst abermals aufrufe. Is auch klar.

Die Frage, die bleibt ist: Wie macht man das richtig und in schön ? :)

Beispiel A
// get all IIS config filepaths recursively
function getIISConfigFilesPath(dir){
    var folderContent = fs.readdirSync(dir);
    var matches = [];
    
    folderContent.forEach(item => {
        var stats = fs.lstatSync(dir + '/' + item);
        
        if(stats.isDirectory()){
            getIISConfigFilesPath(dir + '/' + item);
        }else if(stats.isFile()){
            if(typeof item !== 'undefined' 
               && item === config.IIS_CONFIG_FILE){
                
                matches.push(dir + '/' + item);
                console.log(matches);
            }
        }
    });
    
    return matches;
};
Beispiel B
function getIISConfigFilesPath(dir){
    
    var matches = [];
    
    var recursion = function(dir, matches){
        var folderContent = fs.readdirSync(dir);

        folderContent.forEach(item => {
            // lstat doesn't follow symbolic links
            var stats = fs.lstatSync(dir + '/' + item);

            if(stats.isDirectory()){
                recursion(dir + '/' + item);
            }else if(stats.isFile()){
                if(typeof item !== 'undefined' 
                   && item === config.IIS_CONFIG_FILE){

                    matches.push(dir + '/' + item);
                    console.log(matches);
                }
            }
        });
    }(dir, matches);
    
    return matches;
};

akzeptierte Antworten