如何阻止我的函数返回“引用错误:( ...)未定义”

时间:2015-08-04 11:50:00

标签: javascript reference undefined

我已经得到了这段代码并且它正在返回reference error,但我不知道为什么,我看到很多Q&关于参考错误,但我仍然找不到它。任何帮助表示赞赏。

提前致谢,可能会有力量与您同在。

我的代码:

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

2 个答案:

答案 0 :(得分:4)

您只是在立即调用的命名函数表达式的范围内声明该函数。 所以当你打电话给它后,它就不会出现在线上了。

您可以选择将功能声明为

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

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

答案 1 :(得分:1)

使用命名函数表达式创建

printDadSon

命名函数表达式在自己的范围内创建一个变量(与其名称相匹配)。

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

以上行在函数范围内,因此可以访问该变量。

printDadSon(data);

上述行

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