首页 > 解决方案 > 为什么我在几次迭代后得到“未定义”?

问题描述

下面的代码发生了一件奇怪的事情。代码运行顺利,只有一个例外 - 经过几次迭代,我得到“未定义”。

您可以通过运行几次来测试它。起初,您将获得常规输出(三个随机城市),然后在某些时候您将获得“未定义”。这发生在不到 10 次迭代中。

为什么这样做?我错过了什么?

var coolWords = ["Amsterdam", "Berlin", "Sofia", "Prague", "Lisbon", "London", "Malaga", "Copenhagen", "Milan"];
    
var newList = [];
    
function niceTripleCombo(coolWords) {
  for (let i = 0; i < 3; i++) {
    var combo = coolWords[Math.floor(Math.random()*coolWords.length)];
    newList.push(" " + combo);
  };
};
    
function iterator(x) {
  if (newList[0] !== newList[1] && newList[1] !== newList[2] && newList[1] !== newList[3]) {
    return newList;
  } else {
    return niceTripleCombo(coolWords);
  }
};
    
    console.log(iterator(niceTripleCombo(coolWords)));

标签: javascriptfor-loopundefined

解决方案


让我们考虑这个测试运行。

最初,iterator(niceTripleCombo(coolWords))从 调用console.log()

现在niceTripleCombo(coolWords)将被调用。

niceTripleCombo(coolWords) 开始

现在在 for 循环中,

i = 0,假设我们得到newList = [" Milan"]

i = 1,假设我们得到newList = [" Milan", " London"]

i = 2,假设我们得到newList = [" Milan", " London", " London"]

niceTripleCombo 结束(coolWords)

最后我们有米兰、伦敦、伦敦

现在在iterator(),

由于我们有 2 个伦敦,if将失败并else运行。

现在这是第一个错误,您没有将 初始化newList为空。所以当niceTripleCombo再次运行时,它将增加三个城市。

你可能会得到,例如,[" Milan", " London", " London", " Amsterdam", " Malaga", " Sofia"]

其次return niceTripleCombo(coolWords);不会返回任何值。

为什么它不会返回任何东西是因为,您正在返回一个niceTripleCombo(coolWords)没有 return 语句的函数 []。

您的函数必须返回任何值,或者如果返回一个函数,该函数必须返回一个值。在您的情况下,您没有return 语句,默认情况下,如果没有返回其他值,则返回niceTripleCombo(coolWords) js 函数。undefined

这就是为什么你得到undefined.

所以,把你else的改成iterator这样:

else {
  newList = [];
  niceTripleCombo(coolWords);
  return iterator();
}

现在你不应该得到undefined. 接下来,无需传递niceTripleComboto iterator。由于您没有使用niceTripleCombo您内部的功能iterator

return在 MDN 中阅读更多信息: return 声明


推荐阅读