【发布时间】:2017-01-02 11:36:54
【问题描述】:
我在 Eloquent JavaScript 的第 4 章练习中的第 n 个函数的代码如下:
function nth(list, num){
var node = list;
if(num === 0) {
return node.value;
} else {
if (node.rest) {
node = node.rest;
nth(node, num - 1);
} else {
return undefined;
}
}
}
console.log(nth(arrayToList([10,20,30]),1));
// -> 20
我有一个按预期工作的函数的迭代版本;然而,即使在 return 语句正确打印 node.value 之前调用 console.log,该函数的递归版本也会返回 undefined。为什么?
这也是arrayToList函数:
function arrayToList(arr){
var list = {value: arr[arr.length - 1], rest: null};
for (var i = arr.length - 2; i >=0; i--){
list = {value: arr[i], rest: list};
}
return list;
}
【问题讨论】:
-
您在递归调用中缺少
return。如果您不返回递归调用返回的内容,则结果将为undefined。 -
return nth(node, num - 1); -
因为你从不做
return nth(node, num - 1);所以函数执行nth(...)然后永远不会返回那个函数的结果。始终在任何地方定义明确的返回值。 -
另一种选择:
var arrayToList = arr => arr.reduceRight((rest, value) => ({value, rest}), null);和var nth = (list, num) => list /* && num >= 0*/? num? nth(list.rest, num-1): list.value: void 0;
标签: javascript