2013-08-26 28 views
0

我试图给三个变量分配三个随机数(random1,random2,random3),然后将这些随机变量分配给三个元素。但我不希望它们中的任何一个等于变量Sum,它是两个数字innerHTML值的添加。三重条件同时循环

所以我已经使用do...while循环,但不幸的是do...while循环无法按预期方式工作。

这里是我的代码:

setTimeout(function() { 
    z.innerHTML = Math.floor((Math.random() * 3) + 1); 

    setTimeout(function applySUM() { 
     var Sum = parseInt(document.getElementById('fir').innerHTML) + 
      parseInt(document.getElementById('sec').innerHTML); 
     ch1.innerHTML = Sum; 
    }, 500); 

    do { 
     var random1 = Math.floor((Math.random() * 3) + 1); 
     var random2 = Math.floor(Math.random() * (6 - 4 + 1)) + 4; 
     var random3 = Math.floor(Math.random() * (10 - 7 + 1)) + 7; 
    } while (random1 == Sum || random2 == Sum || random3 == Sum); 

    setTimeout(function func() { 
     ch2.innerHTML = random1; 
    }, 1000); 

    setTimeout(function func() { 
     ch3.innerHTML = random2; 
    }, 1500); 

    setTimeout(function func() { 
     ch4.innerHTML = random3; 
    }, 2000); 

}, 2000); 

看看上面的代码,它似乎为ch2.innerHTMLch3.innerHTMLch4.innerHTML不可能等于Sum,但是当我测试它的现实说别的东西。为什么是这样?

+0

实际发生的事情有点不清楚,为了澄清,ch2,ch3和ch4的内部html全部设置为总和,并且您不期望这是正确的? – Jordan

+0

所有'setTimeout'的原因是什么? Sum的变量是** local **到'setTimeout'回调,因此在'do ... while'循环的条件下不可访问。我很惊讶代码运行。请添加当前未包含在此示例中的变量定义并创建一个http://jsfiddle.net/演示。 –

+1

你有一个范围问题。 'Sum'定义在由嵌套setTimeout调用的函数范围内(而不是您指定的setTimeout函数)。它并不知道如何给出建议来解决这个问题,因为在调用'setTimeout()'的时候,这看起来很奇怪。我不确定你实际上想要做什么。 –

回答

1

关于范围的评论看起来像是在正确的轨道上。这里是你的代码的相关部分:

setTimeout(function applySUM() { 
    var Sum = parseInt(document.getElementById('fir').innerHTML) + 
     parseInt(document.getElementById('sec').innerHTML); 
    ch1.innerHTML = Sum; 
}, 500); 
// Outside of your applySum function, Sum has no meaning 

do { 
    var random1 = Math.floor((Math.random() * 3) + 1); 
    var random2 = Math.floor(Math.random() * (6 - 4 + 1)) + 4; 
    var random3 = Math.floor(Math.random() * (10 - 7 + 1)) + 7; 
} while (random1 == Sum || random2 == Sum || random3 == Sum); 
// Outside of your loop body, random1, random2, and random3 have no meaning 
// undefined == undefined => true 

或许,如果你把它改成这样:

var Sum = 0; 
setTimeout(function applySUM() { 
    Sum = parseInt(document.getElementById('fir').innerHTML) + 
     parseInt(document.getElementById('sec').innerHTML); 
    ch1.innerHTML = Sum; 
}, 500); 

var random1 = random2 = random3 = undefined; 
do { 
    random1 = Math.floor((Math.random() * 3) + 1); 
    random2 = Math.floor(Math.random() * (6 - 4 + 1)) + 4; 
    random3 = Math.floor(Math.random() * (10 - 7 + 1)) + 7; 
} while (random1 == Sum || random2 == Sum || random3 == Sum); 

然后您的变量可能范围在适当的地点。只是预感,这可能还有其他问题。

+0

打败我吧。然而,你应该把'Sum = parseInt(document.getElementById('fir')。innerHTML)+ parseInt(document.getElementById('sec')。innerHTML);'setTimeout之外,用户需要这些特定值,并且只想等待显示到页面上的内容。 – Jordan

+0

我想这是有道理的,尽管我真的不知道他在用这段代码试图完成什么。我只是解决了编程错误,而不是与策略或风格相关的任何事情。你为什么不提交一个对情况更加细致了解的答案?我喜欢更清晰,更清晰的重写。 – mattbornski

2

的第一件事情,因为很多人提到的,总和变量是本地的ApplySum所以你的代码的其余部分引用一个全局总和变量,而不是(这是默认的“不确定”)

另一个问题是,现在您的do-while循环立即运行,没有等待500毫秒超时,并且Sum被分配给一个值。你可以把你的代码的setTimeout回调内部解决这个问题:

z.innerHTML = Math.floor((Math.random() * 3) + 1); 

setTimeout(function applySUM() { 
    var Sum = parseInt(document.getElementById('fir').innerHTML) + 
     parseInt(document.getElementById('sec').innerHTML); 
    ch1.innerHTML = Sum; 


    do { 
     var random1 = Math.floor((Math.random() * 3) + 1); 
     var random2 = Math.floor(Math.random() * (6 - 4 + 1)) + 4; 
     var random3 = Math.floor(Math.random() * (10 - 7 + 1)) + 7; 
    } while (random1 == Sum || random2 == Sum || random3 == Sum); 

    setTimeout(function func() { 
     ch2.innerHTML = random1; 
    }, 500); 

    setTimeout(function func() { 
     ch3.innerHTML = random2; 
    }, 1000); 

    setTimeout(function func() { 
     ch4.innerHTML = random3; 
    }, 1500); 

}, 500); 

(我也减少了从其他一个定时器为500ms,以补偿他们的第一超时内移动)

另一个微小的变化,你可以考虑正在为每个变量做一个单独的循环,而不是所有的变量。

var random1, random2, random3; 
do { random1 = Math.floor((Math.random() * 3) + 1);   } while (random1 == Sum); 
do { random2 = Math.floor(Math.random() * (6 - 4 + 1)) + 4; } while (random2 == Sum); 
do { random3 = Math.floor(Math.random() * (10 - 7 + 1)) + 7; } while (random3 == Sum);