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

标签 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);

最佳答案

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

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

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

关于javascript - 递归函数调用在 console.log() 上返回 [Circular],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24463035/

相关文章:

javascript - 如何在 Yeoman 中使用 promises 进行递归提示?

javascript - axios onUploadProgress 和 onDownloadProgress 不适用于 CORS

javascript - 重新启动 EC2 实例后,AWS S3 存储桶未重新安装

recursion - 标准 ML 斐波那契溢出

python - 在 Python 中,如何返回任意嵌套元素的索引列表?

c# - 如何递归地填充数组

c++ - 为什么当将迭代器作为参数传递并在尾部位置递归时,后缀失败而前缀工作正常?

javascript - 如何管理 CouchDB 代码出来呢?

javascript - 如何使用 PHP 处理 Controller 的 XMLhttp 请求

javascript - 自定义 Azure DevOps REST API 调用