Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 三重条件do-while循环_Javascript_Loops - Fatal编程技术网

Javascript 三重条件do-while循环

Javascript 三重条件do-while循环,javascript,loops,Javascript,Loops,我试图将三个随机数分配给三个变量(random1,random2,random3),然后将这些随机变量分配给三个元素。但是我不希望它们中的任何一个等于变量Sum,它是两个数值innerHTML值的相加 因此,我使用do…while循环完成了这项工作,但不幸的是do…while循环没有按预期工作 这是我的密码: setTimeout(function () { z.innerHTML = Math.floor((Math.random() * 3) + 1); setTimeou

我试图将三个随机数分配给三个变量(
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.innerHTML
ch3.innerHTML
ch4.innerHTML
等于
Sum
,但当我测试它时,现实表明了另一个问题。这是为什么呢?

关于scope的评论似乎在正确的轨道上。以下是代码的相关部分:

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);

然后,您的变量可能在适当的位置具有作用域。这只是一种预感,可能还有其他问题。

关于scope的评论似乎走对了方向。以下是代码的相关部分:

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);

然后,您的变量可能在适当的位置具有作用域。这只是一种预感,可能还有其他问题。

首先,正如许多人提到的,sum变量是ApplySum的本地变量,因此代码的其余部分将引用全局sum变量(默认情况下它是“未定义的”)

另一个问题是,现在您的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);

首先,正如许多人提到的,sum变量是ApplySum的本地变量,因此代码的其余部分将引用全局sum变量(默认情况下它是“未定义的”)

另一个问题是,现在您的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);

有点不清楚实际发生了什么,为了澄清起见,
ch2
ch3
ch4
的内部html都设置为总和,您不希望这样,对吗?所有
设置超时的原因是什么?变量
Sum
setTimeout
回调的本地变量,因此在
do…while
循环的情况下不可访问。我很惊讶代码居然能运行。请添加当前未包含在此示例中的变量定义并创建演示。您的范围有问题
Sum
是在嵌套的setTimeout调用的函数范围内定义的(不是您指定的setTimeout函数)。它实际上并不知道如何给出建议来解决这个问题,因为您对
setTimeout()
进行所有这些调用的方式似乎很奇怪。我不确定你到底想做什么。有时我想要的只是发生了&ch2.innerHTML、ch3.innerHTML和ch4.innerHTML都不等于Sum,但有时其中一个或多个等于Sum,这是我不希望发生的问题,这个问题导致我的do-while循环没有完全纠正。为了解决MikeBrant和FelixKling正在讨论的问题,请尝试在setTimeout之前声明并设置sum,然后在setTimeout内,您可以根据自己的意愿设置innerHTML。实际发生的情况有点不清楚,请澄清,
ch2
ch3
ch4
的内部html都设置为总和,您不希望这样,对吗?所有
setTimeout
的原因是什么?变量
Sum
setTimeout
回调的本地变量,因此在
do…while
循环的情况下不可访问。我很惊讶代码居然能运行。请添加当前未包含在此示例中的变量定义并创建演示。您的范围有问题
Sum
是在嵌套的setTimeout调用的函数范围内定义的(不是您指定的setTimeout函数)。它实际上并不知道如何给出建议来解决这个问题,因为您对
setTimeout()
进行所有这些调用的方式似乎很奇怪。我不确定你到底想做什么。有时我想要的只是发生了&ch2.innerHTML、ch3.innerHTML和ch4.innerHTML都不等于Sum,但有时其中一个或多个等于Sum,这是我不希望发生的问题,这个问题导致我的do-while循环没有完全正确。要解决MikeBrant和FelixKling正在讨论的问题,请尝试在setTimeout之前声明和设置sum,然后在setTimeout内,您可以根据需要设置innerHTML。请告诉我。但是,您应该将
Sum=parseInt(document.getElementById('fir').innerHTML)+parseInt(document.getElementById('sec').innerHTML)在setTimeout之外,我很清楚,用户需要这些特定的值,并且只想等待在页面上显示内容。我认为这是有意义的,尽管我真的不知道他试图用这些代码实现什么。我只是在解决编程错误,而不是