考虑以下代码块,重复运行(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摇晃”异常(从不抛出“超出X摇晃”)。

解决方案是将Ycc之前的shake设置为0。

我不知道为什么会这样。在这两个块中,我们都先从分配震动开始,所以进入shake = shakeTries = 0块之前shake到底是什么都不重要。我对do的理解(以及我使用它的原因)是,它在测试条件之前先执行其块。

那么,当我在do...while块之前不重置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;


此时,震动具有上一个块中最后使用的值(-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部分的震动值添加到yOffset。

关于javascript - 行为异常:。您能解释吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16726540/

10-12 06:57