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)
) 已经用一个实际的数组调用它,所以只需删除该行,因为它不是正在做(或试图做)任何有用的事情。
我得到了这段代码,它返回了 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)
) 已经用一个实际的数组调用它,所以只需删除该行,因为它不是正在做(或试图做)任何有用的事情。