javascript - 为什么我在几次迭代后得到“未定义”?
问题描述
下面的代码发生了一件奇怪的事情。代码运行顺利,只有一个例外 - 经过几次迭代,我得到“未定义”。
您可以通过运行几次来测试它。起初,您将获得常规输出(三个随机城市),然后在某些时候您将获得“未定义”。这发生在不到 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)));
解决方案
让我们考虑这个测试运行。
最初,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
. 接下来,无需传递niceTripleCombo
to iterator
。由于您没有使用niceTripleCombo
您内部的功能iterator
。
return
在 MDN 中阅读更多信息: return 声明
推荐阅读
- jquery - 如何限制DataTable单个单元格中的数据
- c++ - Linux 上 Eclipse cdt 的 CMake 项目生成器?
- java - 如何将 3D 矢量旋转 3d 角度?
- python - Python 循环中的竞争条件
- logging - 将转发的 rsyslogs 写入 journald 以便能够通过 SYSLOG_IDENTIFIER 过滤它们?
- swift - 在集合视图 firebase 和 swift 中为所有用户加载帖子
- azure - 安全存储容器上的 Azure 函数应用
- react-native - 无法为新项目提取 react-native 空白模板
- python - Python - 编译时 sys.path[0] 不工作
- r - r:在自定义函数中嵌套一个 for 循环