函数的第一个 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){
.......
所以我这里有一个函数,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){
.......