函数的第一个 return 值未定义?

First return value of function undefined?

所以我这里有一个函数,return是每个函数调用的数组元素。它通过检查另一个使用过的元素被推送到的数组来避免 return 对同一个元素进行两次检查。

问题是,当我第一次 运行 时,我总是得到 "undefined" 的回报。如果我进行多个 console.log 调用,则第一个 return 之后的调用是一个元素。

我认为这与我的第一个 "if" 陈述有关,但我不确定。空数组 return 的长度 属性 是否为 0?这是我的 "if" 声明中的问题吗?

感谢所有帮助,在此先感谢。

var fortunesList = [
  "A",
  "B",
  "C",
  "D",
];

  var usedFortunes = [];


var getFortune = fortunesList[Math.floor(Math.random()*fortunesList.length)];

function fortuneCookieGenerator(getFortune) {
  if (usedFortunes.length == 0) {
    usedFortunes.push(getFortune);
  }   
  else if (usedFortunes.length > 0) {
    for (i = 0; i < usedFortunes.length; ++i) {
      if (usedFortunes[i] == getFortune) {
        getFortune = fortunesList[Math.floor(Math.random()*fortunesList.length)];
        i = 0;
      }  
    }
    usedFortunes.push(getFortune);
  }
  return getFortune;
}


console.log(fortuneCookieGenerator());
console.log(fortuneCookieGenerator());
console.log(fortuneCookieGenerator());
console.log(fortuneCookieGenerator());

getFortune 是未定义的,因为您将其作为 fortuneCookieGenerator 的参数,但您没有传递任何内容。在你的函数第一次被调用后 usedFortunes.length 大于 0 触发 else 分支并且你将一个新值分配给 getFortune 和 return that.

您可能还会从这些 JS 调试指南中受益:Creativebloq, MDN, Google and MSDN

如果条件不成立,getFortune() 将是未定义的,所以我认为您还需要添加 else 部分来初始化它。

您的函数具有下一个签名

function fortuneCookieGenerator(getFortune)

这意味着你可以传递一个参数,getFortune给它。现在,当你想调用上面的函数时,你使用下一个;

fortuneCookieGenerator()

这意味着您在不传递参数的情况下调用函数。因此,在第一次调用时,getFortune 尚未定义。此外,变量 usedFortunes 仍然是空的。结果,

usedFortunes.push(getFortune);

从第一个 if 块开始调用。您正在将一个未定义的变量推送到数组。完成后,程序将继续

return getFortune;

其中 returns undefined.

在第二次调用时,你仍然没有传递参数,但是变量usedFortunes现在不为空。所以它将执行 else if 块。在那里,你有

getFortune = fortunesList[Math.floor(Math.random()*fortunesList.length)];

初始化变量。结果,

return getFortune;

持有一些东西,你不再收到 undefined。这就是为什么您在第一次通话时得到 undefined,但在第二次和以后的通话中却没有。

首先这样做:

console.log(fortuneCookieGenerator(getFortune));

或者,

function fortuneCookieGenarator(getFortune){
.......