带有递归的Javascript动画,奇怪的行为

带有递归的Javascript动画,奇怪的行为,javascript,animation,recursion,Javascript,Animation,Recursion,我试图用javascript编写ruzzle解算器代码。现在,它只是在迷宫中挖掘,找到每一条可能的路径(将来我会将它们与字典进行匹配,以找到其中真正有效的单词) 您可以在这里看到:http://178.239.177.105/ruzzle/ 我想用一个动画来演示算法是如何工作的,但我提出了一个问题。 如果你加载它,页面就不会显示任何内容,我的浏览器会在一段时间后崩溃 但是 如果在递归函数的中间设置一个警报(“”)函数,则可以通过算法中的任何步骤。 特别是如果您将浏览器设置为阻止显示任何进一步的警

我试图用javascript编写ruzzle解算器代码。现在,它只是在迷宫中挖掘,找到每一条可能的路径(将来我会将它们与字典进行匹配,以找到其中真正有效的单词)

您可以在这里看到:
http://178.239.177.105/ruzzle/

我想用一个动画来演示算法是如何工作的,但我提出了一个问题。 如果你加载它,页面就不会显示任何内容,我的浏览器会在一段时间后崩溃

但是

如果在递归函数的中间设置一个警报(“”)函数,则可以通过算法中的任何步骤。 特别是如果您将浏览器设置为阻止显示任何进一步的警报消息,您将最终看到迷宫上的动画

实际上,我正试图通过setInterval()实现这一点,但不起作用

所以我有两个问题: -为什么脚本会导致页面崩溃,或者在出现警报时不会崩溃? -如何使用某种on wait()机制正确显示动画

谢谢

通过进入页面查看源代码,您可以查看所有代码,但是为了清晰起见,我将在此处粘贴相关代码:

您还可以在此处使用代码: (必须取消注释中的最后一行才能运行)

//此字符矩阵表示4x4拼图
var ruzle_模型=[“w”、“a”、“l”、“k”]、[“m”、“o”、“o”、“n”]、[“h”、“a”、“t”、“e”]、[“r”、“o”、“p”、“e”];
//“偏移”表示四个运动矢量(上、下、左、右)
//用于访问矩阵
var偏移量=[[1,0],[0,1],-1,0],[0,-1];
//挖掘迷宫的递归函数
功能路径(m、i、j、路径、检查){
警报(“设置浏览器以避免下次警报MSG!”);
//基本情况,如果未撞到墙或已检查单元

如果(!(i=0&&j>=0&&jJavascript循环和递归禁止呈现页面,则所做的任何更改都将保持不可见,直到脚本停止执行,例如生成
警报时。当用户设置“不显示警报消息”时“,警报仍会向基础eventloop产生执行时间,这将更新页面

要获得尽可能快(高fps)的动画,请使用
requestAnimationFrame()

在您的情况下,
setTimeout()
是最好的方法。在对
path
的递归调用上设置超时

function recursive(args) {
    // do stuff to args
    setTimeout(function () {
        recursive(args);
    }, 5);
}

谢谢你的例子。我试过了,它的表现非常奇怪。像这样,完全改变输出:
setTimeout(function(){tmp.push(path(m,I+offset[0],j+offset[1],path+m[I][j],copy(checkeds));},500)
像这样,仅应用于
路径
函数更糟糕,它开始打印数字!!
tmp.push(setTimeout(函数(){path(m,i+offset[0],j+offset[1],path+m[i][j],copy(checkeds));},500));
我想你必须重构你的算法。我看不到一个解决方案能按原样处理你的代码。试着改变它,以便你在函数参数中传递你的输出数组,而不是依赖于返回。
function recursive(args) {
    // do stuff to args
    setTimeout(function () {
        recursive(args);
    }, 5);
}