JavaScript递归的奇怪行为?
我很难理解为什么我用JavaScript编写的递归函数会出现问题。当我向它提供一个大的json文件时,它会陷入一个无休止的循环中。我觉得这与JavaScript闭包的工作方式有关。让一个聪明的人看看我的代码,然后解释发生了什么 我已经将函数行for line移植到PHP,它生成了我期望的输出 JavaScript:JavaScript递归的奇怪行为?,javascript,php,node.js,recursion,closures,Javascript,Php,Node.js,Recursion,Closures,我很难理解为什么我用JavaScript编写的递归函数会出现问题。当我向它提供一个大的json文件时,它会陷入一个无休止的循环中。我觉得这与JavaScript闭包的工作方式有关。让一个聪明的人看看我的代码,然后解释发生了什么 我已经将函数行for line移植到PHP,它生成了我期望的输出 JavaScript: var jsonfile = process.argv[2]; json = require("./"+jsonfile); path = "2"; buildPaths(js
var jsonfile = process.argv[2];
json = require("./"+jsonfile);
path = "2";
buildPaths(json, path);
function buildPaths(json, path) {
if (json.Children == null || json.Children.length == 0) {
console.log(path + "/" + json.TypedItemId);
} else {
for (i = 0; i < json.Children.length; i++) {
buildPaths(json.Children[i], path + "/" + json.TypedItemId);
}
}
}
PHP输出(正确):
JavaScript节点输出(不正确):
JavaScript没有问题,除了循环中使用的迭代器:
for (i = 0; i < json.Children.length; i++) {
你自己试试吧:
var json={“typedteimid”:4,“Children”:[{“typedteimid”:67,“Children”:[{“typedteimid”:90,“Children”:[{“typedteimid”:90,“Children”:[{“typedteimid”:90,“Children”:[},{“typedteimid”:908,“Children”:[]},{“typedteimid”:908,“Children”:[{“typedteimid”:,“Children:[]}]},{“TypedItemId”:908,“Children:[]}]},{“TypedItemId”:908,“Children:[{“TypedItemId”:90,“Children:[]},{“TypedItemId”:908,“Children:[]}]};
var path=“2”;
构建路径(json,path);
函数构建路径(json,路径){
if(json.Children==null | | json.Children.length==0){
log(路径+“/”+json.TypedItemId);
}否则{
for(var i=0;i }
你的JS代码中没有任何闭包。只是一个普通的函数。好吧,ty仍然很好奇到底是什么导致了不同的输出。我想知道是什么原因导致了JavaScript的结果,我不明白这是什么导致了我看到的辉煌!!I是一个全局变量LOL。现在就测试它。ty=)来轻松捕获这些类型如果有错误,请确保使用使用strict
启用严格模式。是的!感谢您成为我的代码审查专家。使用strict;
将为您节省两个重要的教训。使用strict"; 有关更多错误消息,请始终声明所有变量。曾经听过一篇演讲,建议在编写JavaScript时在函数顶部声明变量,这是一种C风格,这样可以省去自己的麻烦。我完全听从了,接受了,然后说是的。但只有自己动手才能真正学到东西
{
"TypedItemId": 4,
"Children": [
{
"TypedItemId": 67,
"Children": [
{
"TypedItemId": 90,
"Children": [
{
"TypedItemId": 90,
"Children": [
{
"TypedItemId": 67,
"Children": [
{
"TypedItemId": 90,
"Children": [
{
"TypedItemId": 90,
"Children": []
},
{
"TypedItemId": 908,
"Children": []
}
]
},
{
"TypedItemId": 908,
"Children": [
{
"TypedItemId": 90,
"Children": []
},
{
"TypedItemId": 908,
"Children": []
}
]
}
]
}
]
},
{
"TypedItemId": 908,
"Children": []
}
]
},
{
"TypedItemId": 908,
"Children": [
{
"TypedItemId": 90,
"Children": []
},
{
"TypedItemId": 908,
"Children": []
}
]
}
]
}
]
}
2/4/67/90/90/67/90/90
2/4/67/90/90/67/90/908
2/4/67/90/90/67/908/90
2/4/67/90/90/67/908/908
2/4/67/90/908
2/4/67/908/90
2/4/67/908/908
2/4/67/90/90/67/90/90
2/4/67/90/90/67/90/908
for (i = 0; i < json.Children.length; i++) {
for (var i = 0; i < json.Children.length; i++) {