当我按开始按钮时,为什么我的脚本冻结



这是指向我的代码的链接:https://jsfiddle.net/springleader/vt56fy85/12/

我正在为学校制作Simon启发的内存游戏,但是当我按开始按钮时,我的凌乱,长的JavaScript代码会冻结。我不是网络编程专家,我仍在自学。

这是启动的地方(单击开始按钮时)

document.getElementById("uibtn").onclick = function(){
    var uibtn = e('uibtn');
    uibtn.remove("uibtn");
    removeHeader();
}

它删除了启动按钮并跳到" removeheader"功能。

function removeHeader(){
    var rndhdr = e('rndhdr');
    var rndv1 = rndhdr.childNodes;
    while(rndv1.length >= 1){
        rndv1[0].remove();
    }
    createHeader();
}

此部分不完整,并检查现有的圆形计数器(例如"回合1")并删除它。然后调用CreateHeader()。

function createHeader(){
    var rndhdr = e('rndhdr');
    var hdr = document.createElement('h');
    hdr.setAttribute('id', 'hdr');
    hdr.setAttribute('class', 'hc');
    hdr.innerHTML = "<h>Round 1</h>";
    rndhdr.appendChild(hdr);
    Game();
}

此功能放置了一个新的圆头标头"第1轮"。这将根据用户完成的回合而改变,但尚未添加该部分。

function Game(){
    var corct = true;
    while(corct == true){
        var newcol = Math.floor((Math.random() * 4) + 1);
        sofar = newcol.toString() + sofar;
        Flashing(sofar);
    }
}

该部分生成一个数字1到4,该数字对应于按钮(分别为绿色,红色,蓝色和黄色),并将其添加到包含所有生成数字的数组中。然后它跳到flashing()函数。

function Flashing(){
    thr = sofar.length;
    while(sofar[thr] > -1){
        var btn = sel(sofar[thr]);
        btn.style.borderColor = "white";
        blinking = true;
        setTimeout(function(){Flash(btn);}, 2000);
        thr--;
    }
    Game();  
}
function Flash(el){
    el.style.borderColor = el.style.backgroundColor;
    blinking = false;
}

此功能获取SOFAR []数组中的字符串数,然后调用flash(),将flash()闪烁列表中的按钮2秒。

我在重新阅读它的同时尝试了一些调整代码,现在超出了我的呼叫堆栈大小。我不知所措,为什么这会破裂...

这个答案是在编辑问题之前编写的。我相信它仍然可以解决此问题的关键。

当我将您的代码重建到独立页面并运行它时,Firefox警告我有关无反应的脚本。杀死它显示了它在控制台中终止的线路。在那里看,我看到

while(running == true){

那个循环中没有任何将running设置为false的循环(或者确实是脚本中的任何地方)。另外,

while(blinking = true){}

是保证的无限循环。在上面,您在

中还有另一个无限循环
while(corct == true){

只要JavaScript引擎正在运行您的代码,浏览器就会无反应。无限循环不要在网络浏览器中飞行。

另外,很难读取您的代码。请使用更多元音。

最新更新