How can I stop my function from returning "Reference error: (...) is not defined"

How can I stop my function from returning "Reference error: (...) is not defined"

我得到了这段代码,它返回了 reference error,但我不知道为什么,我看到很多关于引用错误的问答,但我仍然找不到它。感谢任何帮助。

在此先致谢,愿原力与你同在。

我的代码:

 var data = '[{"name":"node1","id":1,"is_open":true,"children":[{"name":"node2","id":6,"children":[{"name":"child3","id":7}]},{"name":"child1","id":2}]}]';

 var dadSon = [];

 (function printDadSon(data, parent) {
   if (!data) return;
   for (var i = 0; i < (data.length); i++) {
     if (parent && parent != 'undefined') {
       console.log('Dad: ' + parent + ' & Son: ' + data[i].id);
       dadSon += ('Dad: ' + parent + ' & Son: ' + data[i].id);
     }

     printDadSon(data[i].children, data[i].id);

   }
 })(JSON.parse(data));

 printDadSon(data);

您只是在立即调用的命名函数表达式的范围内声明函数。 所以当你调用它时,它在之后的行上是不可见的。

您可以选择将函数声明为

 var data = '[{"name":"node1","id":1,"is_open":true,"children":[{"name":"node2","id":6,"children":[{"name":"child3","id":7}]},{"name":"child1","id":2}]}]';

 var dadSon = [];

 function printDadSon(data, parent) {
   if (!data) return;
   for (var i = 0; i < (data.length); i++) {
     if (parent && parent != 'undefined') {
       console.log('Dad: ' + parent + ' & Son: ' + data[i].id);
       dadSon += ('Dad: ' + parent + ' & Son: ' + data[i].id);
     }

     printDadSon(data[i].children, data[i].id);

   }
 }
 printDadSon(JSON.parse(data));

但是你不需要在之后调用它,之后的行是无用的(而且你的代码是错误的,因为你没有解析 JSON),只需使用

 var data = '[{"name":"node1","id":1,"is_open":true,"children":[{"name":"node2","id":6,"children":[{"name":"child3","id":7}]},{"name":"child1","id":2}]}]';

 var dadSon = [];

 (function printDadSon(data, parent) {
   if (!data) return;
   for (var i = 0; i < (data.length); i++) {
     if (parent && parent != 'undefined') {
       console.log('Dad: ' + parent + ' & Son: ' + data[i].id);
       dadSon += ('Dad: ' + parent + ' & Son: ' + data[i].id);
     }

     printDadSon(data[i].children, data[i].id);

   }
 })(JSON.parse(data));

第二个版本的优点是它不会用您不需要的函数声明污染外部作用域。

printDadSon 是使用 命名函数表达式 .

创建的

命名函数表达式在它们自己的范围内创建一个变量(匹配它们的名字)。

printDadSon(data[i].children, data[i].id);

上面一行在函数的范围内,所以它可以访问那个变量。

printDadSon(data);

上面那行是不是

但是,它传递了一个 字符串 并且前面的行 ((JSON.parse(data)) 已经用一个实际的数组调用它,所以只需删除该行,因为它不是正在做(或试图做)任何有用的事情。