Javascript 为什么我的页面会陷入无限循环? 函数randomNumber(){ var值; var标志=假; var tds=document.querySelectorAll('td'); 做{ value=Math.round(Math.random()*(26-1)+1); 对于(var t=0;t

Javascript 为什么我的页面会陷入无限循环? 函数randomNumber(){ var值; var标志=假; var tds=document.querySelectorAll('td'); 做{ value=Math.round(Math.random()*(26-1)+1); 对于(var t=0;t,javascript,random,html-table,infinite-loop,innerhtml,Javascript,Random,Html Table,Infinite Loop,Innerhtml,此函数为新td的innerHTML返回一个随机数。如果有其他tds的编号与此代码生成的编号相同,则循环将再次启动。如果生成的数字是唯一的,我将其添加到新td的innerHTML中。但我甚至无法加载页面,因为我遇到了一个无限循环,但无论我如何努力,我都无法注意到这段代码的逻辑问题。只要您的循环找到tds[t].innerHTML==value它将标志设置为真——此时,您永远无法结束循环,因为您没有检查可以将标志设置为假,因此循环条件始终为真 下面是一个类似的例子,用数组说明了这一点。您可以看到,有

此函数为新td的innerHTML返回一个随机数。如果有其他tds的编号与此代码生成的编号相同,则循环将再次启动。如果生成的数字是唯一的,我将其添加到新td的innerHTML中。但我甚至无法加载页面,因为我遇到了一个无限循环,但无论我如何努力,我都无法注意到这段代码的逻辑问题。

只要您的循环找到
tds[t].innerHTML==value
它将
标志设置为
——此时,您永远无法结束循环,因为您没有检查可以将
标志
设置为
,因此循环条件始终为真

下面是一个类似的例子,用数组说明了这一点。您可以看到,有时它会将数字添加到数组中(在找到新值的情况下),但在其他情况下,循环会执行5000次迭代并退出(因为它从未找到新值),在这种情况下,它会将
未定义的
添加到数组中,因为函数没有返回任何内容

const arr=[]
函数randomNumber(){
var值;
var标志=假;
var tds=arr
var迭代次数=0
做{
value=Math.round(Math.random()*(26-1)+1);
对于(var t=0;t对于(设i=0;i函数至少一次将
标志设置为true的那一刻,它的over-it不再将其设置为false。为了修复它,我添加了一行代码

函数randomNumber(){
var值;
var标志=假;
var tds=document.querySelectorAll('td');
做{
flag=false;//我添加了这一行
value=Math.round(Math.random()*(26-1)+1);
对于(var t=0;t
我还将为您编写更高效的代码

function randomNumber(){
    var value;
    var flag = false;
    var tds = document.querySelectorAll('td');
    do{
        value = Math.round(Math.random() * (26 - 1) + 1);
        for(var t = 0; t < tds.length; t++){
            if(tds[t].innerHTML == value)
                flag = true;
        }
        if(!flag){
            return value;
        }
    }while(flag == true)
}
带有随机项的行的注释:

  • random()返回从0到1的数字
  • 正如您所写的,该值将是介于1和26之间的随机数(仅此值)
  • 如果已经使用了所有的值,那么我们的循环将不会结束(当1到26之间的所有值都已使用时,我们永远找不到1到26之间未使用的值)
可以做些什么

  • 在这种情况下,您可以添加一些计数器(如@Ben所做的)并退出循环
  • 或者你可以把数字26提高到更高
  • 您可以使用连续的数字(全部获取,取最大值,添加1并将其作为新数字返回)

当然,您可以找到其他一些方法来解决这个问题

标志设置为false的条件是什么?问:为什么我的页面会陷入无限循环?答:可能是因为“value”显然总是等于“tds[t].innerHTML”,而标志永远不会保持为“false”。建议:在调试器中逐步检查代码(例如Chrome开发者工具)并查看“价值”当你在循环中迭代时。哇,我只是对一切都那么简单感到有点恼火。我花了大约30分钟来做这件事。非常感谢。当你刚开始使用编程/语言@БМцццццццУцццццццццц109e、 你可以从函数的内部和外部访问
arr
——拥有全局变量并不太好——你真的不应该写这样的代码。还有——为什么你要迭代5000次,比如说,如果所有26个id都已经被使用了呢?如果你只需要检查一下你的函数是否有一点点机会,你将失去超过4800次迭代返回任何需要注意的内容-这是一个示例,旨在说明这些原则&展示迭代是如何进行的,而不是最佳实践解决方案的实现。但是,如果你在他的代码中得到了这些,并且代码投入生产,那将是非常糟糕的
function randomNumber(){
    var value;
    var found = false;
    var tds = document.querySelectorAll('td');
    var existingIds = [];
    tds.forEach(td => existingIds.push(td.innerHHML)); // fill up the ids
    do {
        value = Math.round(Math.random() * (26 - 1) + 1); // this line would make problems (comment below)
        if (existingIds.indexOf(value) === -1) found = true; // check if value can be found in existing ids and if found - set dount to true (you can also return from here, but i would rather user break (if there was more code after this line, than use retur in the middle of any loop;
    } while(found === false)

    return value;
}