所以我有一个脚本,它从当前目录及其下面的所有内容创建一个对象。
这是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);
答案 0 :(得分:1)
使用node.js(javascript语言),您必须小心范围。在您的函数(递归调用)中,您在开始时将这些变量视为在函数范围内,但是对于相同函数的递归调用它们是可访问的。就像你在循环中所做的那样把var放在那些前面。
var nestedFiles = fs.readdirSync(folder);
var currentFile = folder + '/' + nestedFiles.pop();
var main = {
files: {},
dirs: {}
};
我认为这可能是问题所在。将var放在所有内容上,除非您希望它已在范围内可用。除非你已经在全球范围内,但我建议将var放在任何尚未在范围内的变量上。