函数的第一个返回值是否未定义?

时间:2016-02-02 09:03:40

标签: javascript arrays function console.log

所以我在这里有一个函数,它为每个函数调用返回一个数组元素。它通过检查使用元素被推送到的另一个数组来防止两次返回相同的元素。

问题是当我第一次运行它时,我一直在“未定义”。如果我进行多个console.log调用,则第一个调用后的调用将返回一个元素。

我认为这与我的第一个“if”声明有关,但我不确定。空数组是否返回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());

4 个答案:

答案 0 :(得分:2)

getFortune未定义,因为您将其作为fortuneCookieGenerator的参数,但您没有传递任何内容。第一次调用函数后,usedFortunes.length大于0会触发else分支,并为getFortune分配一个新值并返回该值。

您也可以从这些JS调试指南中受益:CreativebloqMDNGoogleMSDN

答案 1 :(得分:1)

您的功能有下一个签名

function fortuneCookieGenerator(getFortune)

表示您可以将参数getFortune传递给它。现在,当你想调用上面的函数时,你可以使用下一个函数;

fortuneCookieGenerator()

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

usedFortunes.push(getFortune);
调用第一个if块中的

。您正在将未定义的变量推送到数组。完成后,程序将进入

return getFortune;

返回undefined

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

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

初始化变量。因此,

return getFortune;

拥有一些东西,你不再收到undefined了。这就是为什么你在第一次通话时得到undefined,而不是在第二次和更多的通话时。

答案 2 :(得分:0)

如果条件不正确,

getFortune()将是未定义的,所以我认为你还需要添加其他部分来初始化它。

答案 3 :(得分:0)

首先这样做:

console.log(fortuneCookieGenerator(getFortune));

或者,

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