2013-08-26 60 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);