gpt4 book ai didi

javascript - 奇怪的 do..while 行为 : can you explain?

转载 作者:行者123 更新时间:2023-11-29 19:53:36 25 4
gpt4 key购买 nike

考虑以下代码块,重复运行 ( jsFiddle ):

var length = 50,
xOffset = 0,
yOffset = 0;
for (var a = 0; a < 100; ++a) { // just so we can see it "break"
for (var l = 1; l <= length; l++) {
var percentComplete = l / length,
scaledPercent = (.5 - Math.abs(percentComplete - .5)) * 2,
shake = 0,
shakeTries = 0,
deviationCeil = Math.ceil(10 * scaledPercent);
if (Math.random() < .1 || Math.abs(xOffset) > deviationCeil)
do {
shake = Math.floor(Math.random() * 3) - 1;
if (++shakeTries > 100) throw "X shake exceeded"
}
while (Math.abs(xOffset + shake) > deviationCeil);
xOffset += shake;
shakeTries = 0; // if we set shake = 0 here, everything works!
if (Math.random() < .1 || Math.abs(yOffset) > deviationCeil)
do {
shake = Math.floor(Math.random() * 3) - 1;
if (++shakeTries > 100) throw "Y shake exceeded"
}
while (Math.abs(yOffset + shake) > deviationCeil);
yOffset += shake;
}
}

重复运行时,抛出“Y shake exceeded”异常(从不抛出“X shake exceeded”)。

解决方案是在 Y block 之前将 shake 设置为 0:shake = shakeTries = 0

我不明白为什么会这样。在这两个 block 中,我们都从分配给 shake 开始,所以在进入 do block 之前,到底是什么 shake 真的不重要。我对 do...while 的理解(以及我使用它的原因)是它在测试条件之前先执行它的 block 。

那么,当我在 do block 之前不重置 shake 时,为什么会失败(不是每次)?

最佳答案

如果我们添加一些额外的 {,这种奇怪的行为会变得更加明显和 } .让我们先看看 X 部分。开始时,shake 和 shakeOffset 都为 0。

if (Math.random() < .1 || Math.abs(xOffset) > deviationCeil) {
do {
shake = Math.floor(Math.random() * 3) - 1;
if (++shakeTries > 100) throw "X shake exceeded"
} while (Math.abs(xOffset + shake) > deviationCeil);
}
xOffset += shake;

此时,shake 具有上一个 block 中最后使用的任何值(-1、0 或 1)。然后我们进入 Y 部分:

shakeTries = 0; // if we set shake = 0 here, everything works!
if (Math.random() < .1 || Math.abs(yOffset) > deviationCeil) {
do {
shake = Math.floor(Math.random() * 3) - 1;
if (++shakeTries > 100) throw "Y shake exceeded"
} while (Math.abs(yOffset + shake) > deviationCeil);
}
yOffset += shake;

如果我们不满足 (Math.random() < .1 || Math.abs(yOffset) > deviationCeil) 的条件, 然后我们跳过 do...while完全并将 X 部分的 shake 值添加到 yOffset。

关于javascript - 奇怪的 do..while 行为 : can you explain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16726540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com