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

我很难理解为什么我用JavaScript编写的递归函数会出现问题。当我向它提供一个大的json文件时,它会陷入一个无休止的循环中。我觉得这与JavaScript闭包的工作方式有关。让一个聪明的人看看我的代码,然后解释发生了什么

我已经将函数行for line移植到PHP,它生成了我期望的输出

JavaScript:

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++) {