在我开始讨论我的问题之前,以下是有关区域之前的代码。
function arrayToList(array) {
var list = null;
for (var i = array.length - 1; i >= 0; i--)
list = {value: array[i], rest: list};
return list;
}
function listToArray(list) {
var array = [];
for (var node = list; node; node = node.rest)
array.push(node.value);
return array;
}
现在,有人可以解释调用函数和返回函数之间的区别。当我调用我的函数时,我的结果未定义。但是,如果我返回我的功能,答案是正确的。有人可以向我解释两者之间的区别吗?
返回:
function nth(list, n) {
if (!list)
return undefined;
else if (n == 0){
return list.value;
}
else
return nth(list.rest, n - 1);
}
没有回报:
function nth(list, n) {
if (!list)
return undefined;
else if (n == 0){
return list.value;
}
else
nth(list.rest, n - 1);
}
感谢您的帮助!
答案 0 :(得分:1)
在第二个代码段中,else
分支中未返回任何内容。你递归地调用你的函数。该函数将返回一个值,但仅返回其调用self。返回的值将被丢弃,最终结果是在最初撤消函数时没有任何内容返回到该位置。
在第一个(工作)片段中,返回值会一直传递给递归的外层,然后传递给它们。
顺便说一下,在这两种情况下你都不会返回功能'。在这两种情况下,您都可以调用该函数,但在第一种情况下,您还会返回其返回值(将其传递给调用者),而在第二种情况下,将忽略返回值。
在具有单独函数的版本下面,这可能比此递归更清晰。
function h() {
return "Hello world";
}
function a() {
return h(); // Calls h() and returns the value that was returned from h() to the caller.
}
function b() {
h(); // Also calls h(), but does nothing with its return value. b() itself returns nothing.
}
alert("a returns: " + a()); // Hello world
alert("b returns: " + b()); // Undefined

答案 1 :(得分:0)
如果没有返回任何内容,那么等待函数调用的变量将是未定义的。当您返回函数调用时,您将返回该执行的结果。当您执行该函数时,您不会返回该执行的结果。让我举个例子:Fiddle
如果您尝试返回稍后要调用的函数,那么也可以执行,但是您需要返回不带括号的函数名称。见这里:Fiddle
以下是上面提到的所有内容的完整代码示例:
function doWork(){
writeResult('doWork Starting');
return 1;
}
function myFunctionWithReturn() {
writeResult('myFunctionWithReturn Starting');
return doWork();
}
function myFunctionWithoutReturn(){
writeResult('myFunctionWithoutReturn Starting');
doWork();
}
function myFunctionWithFunctionReturned() {
writeResult('myFunctionWithFunctionReturned Starting');
return myCallback;
}
function myCallback() {
return 'Callback was called!';
}
function writeResult(message) {
document.getElementById("result").innerHTML += "</br>" + message;
}
writeResult('Starting with return first...');
var result = myFunctionWithReturn();
writeResult('Result: ' + result);
writeResult('Now doing without return...');
result = myFunctionWithoutReturn();
writeResult('Result: ' + result);
writeResult('Now doing returning a function to call later...');
result = myFunctionWithFunctionReturned();
writeResult('Result: ' + result);
writeResult('Now calling the function that was returned...');
result = result();
writeResult('Result: ' + result);
writeResult('Done.');
<div id="result"></div>