有谁知道什么会导致我的 for 循环在满足条件后继续?我会发布整个文件,但它很大。以下是循环:
for (var j = 0; j < depKeyArr.length; j++) {
var directory = angular.copy(dependencies[depKeyArr[j]]),
keyArr = angular.copy(Object.keys(directory));
for (var i = 0; i < keyArr.length; i++) {
var next = i + 1;
if (keyArr[i] && !keyArr[i].includes('Params')) {
if (keyArr[next] && keyArr[next].includes('Params')) {
directory[keyArr[next]] = directory[keyArr[next]].split(', ') !== [''] ? directory[keyArr[next]].split(', ') : undefined
directory[keyArr[next]].push(directory[keyArr[i]])
}
var paramArr = directory[keyArr[next]] ? directory[keyArr[next]] : directory[keyArr[i]]
switch (depKeyArr[j]) {
case 'controller':
angular.module('app').controller(keyArr[i], paramArr)
break
case 'directive':
angular.module('app').directive(keyArr[i], paramArr)
break
case 'factory':
angular.module('app').factory(keyArr[i], paramArr)
break
case 'filter':
angular.module('app').filter(keyArr[i], paramArr)
break
case 'service':
angular.module('app').service(keyArr[i], paramArr)
break
}
}
}
}
因此,在此特定实例中,depKeyArr.length
等于 5,而 keyArr.length
等于 42。尽管如此,当满足这些条件时,两个 for 循环都会继续执行事实上,我预计它们会在 4 点和 41 点停止。如果您能提供任何帮助,以便我能找出原因,那就太好了。
上面更新了代码片段!
另外 - 你们都提到 i 和 j 发生变化,但是当我在调试器中查看它时,它们没有变化。我现在正在查看它 - j = 5 且 depKeyArr.length
为 5。同样,i = 42 且 keyArr.length
为 42...但我' m 在两个循环内,特别是在 switch 语句中的最后一个情况。当 keyArr[i] 未定义时,它会失败。
为了响应 OBDM 提供的答案,我添加了 angular.copy()
以防止从循环内部更新数组。当 bool 条件满足时,它仍然单步进入循环。更令人困惑的是,即使是 if
条件也无法阻止它执行 switch。它应该无法输入以下if
:
if (!keyArr[i].includes('Params'))
因为到那时keyArr[i]
尚未定义。
最新更新 -
看来我已经使用最新的更改成功地打破了内部循环,但它仍然继续到 switch 语句并在 keyArr[i]
上中断,即使该 switch 位于两个循环内以及一个计算结果为 false 的 if
条件。
最佳答案
一般来说,使用“动态值”设置循环的停止条件是一种不好的做法,即在循环迭代时可以更改的值。
以下代码生成无限循环:
for (var j = 0; j < depKeyArr.length; j++) {
depKeyArr.push("whatever");
}
而不是在变量中设置停止条件来防止不明确的行为:
var depKeyArrLen = depKeyArr.length;
for (var j = 0; j < depKeyArrLen; j++) {
depKeyArr.push("whatever");
}
关于javascript - JS : For loop continues to iterate after condition is false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39637975/