递归函数调用在console.log()上返回[Circular]

时间:2014-06-28 02:27:18

标签: javascript recursion

所以我有一个脚本,它从当前目录及其下面的所有内容创建一个对象。

这是return语句的console.log。

› node recursiveObjectifyDir.js
{ files:
   { 'LICENSE-MIT': { stat: [Object] },
     Gruntfile: { stat: [Object] } },
  dirs: { nested2: [Circular] } }

这个[Circular]是什么意思,它来自哪里?

这里是实际的脚本供参考:

var fs = require('fs');
var path = require('path');

function buildFolder(folder) {
    if (!folder) {
        folder = __dirname;
    }
    nestedFiles = fs.readdirSync(folder);
    currentFile = folder + '/' + nestedFiles.pop();
    main = {
        files: {},
        dirs: {}
    };
    while (currentFile !== folder + '/undefined') {
        var fileName = path.basename(currentFile, path.extname(currentFile));
        var fileStat = fs.statSync(currentFile);
        var fullPath = folder + '/' + fileName;
        if (fileStat.isDirectory()) {
            if (fullPath.match(/git/)){
            } else if (fullPath.match(/node_modules/)){
            } else{
              var folderObj = buildFolder(fullPath);
              Object.defineProperty(main.dirs,
                  fileName, {
                      configurable: true,
                      enumerable: true,
                      value: folderObj
                  }
              );
            }
        } else {
            if (fullPath.match(/DS_Store/)){}
            Object.defineProperty(main.files,
                fileName, {
                    configurable: true,
                    enumerable: true,
                    value: {
                        stat: fileStat
                    },
                }
            );
        }
       currentFile = folder + '/' + nestedFiles.pop();
    }
    return main;
}

buildFolderReturn = buildFolder();
console.log(buildFolderReturn);

1 个答案:

答案 0 :(得分:1)

使用node.js(javascript语言),您必须小心范围。在您的函数(递归调用)中,您在开始时将这些变量视为在函数范围内,但是对于相同函数的递归调用它们是可访问的。就像你在循环中所做的那样把var放在那些前面。

var nestedFiles = fs.readdirSync(folder);
var currentFile = folder + '/' + nestedFiles.pop();
var main = {
    files: {},
    dirs: {}
};

我认为这可能是问题所在。将var放在所有内容上,除非您希望它已在范围内可用。除非你已经在全球范围内,但我建议将var放在任何尚未在范围内的变量上。