Javascript调用与返回函数

时间:2015-06-12 22:10:33

标签: javascript function return calling-convention

在我开始讨论我的问题之前,以下是有关区域之前的代码。

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

感谢您的帮助!

2 个答案:

答案 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>