减慢javascript的eval的执行速度

时间:2011-08-03 09:33:11

标签: javascript timer eval karel

我创建了一个基于javascript的Karel机器人(Wikipedia)这样的小机器人。

Karel4Web

可以通过一些简单的命令来控制机器人,例如“前进”,“回转”等等。

用户可以编写一个javascript程序来控制机器人,然后通过javascripts“eval()”函数进行操作,以便机器人移动。

问题是我希望机器人缓慢移动,以便您可以看到他在做什么,以便您可以在编辑器中突出显示当前的代码行。

当前方法:解析

目前我通过解析textarea中的每一行然后构建一个动作堆栈然后用window.setTimeout一个接一个地执行来解决这个问题(在离线版本中)。但这当然是有限的,因为我必须为每个小的javascript语言构造编写解析代码,这是很容易的工作和错误。

其他一些信息:

解析版本:http://abi-physik.de/_niki2/niki.php

解析版本js代码:http://abi-physik.de/_niki2/js/niki.js

重要的功能位于脚本的底部:run(),execute()

我目前正在逐行解析用户脚本并将操作添加到堆栈中。如果解析器遇到“if”,它将开始一个新的堆栈并将所有操作添加到该堆栈。如果解析器遇到“}”,它将关闭“if”堆栈并继续向基本堆栈添加操作。

有什么想法改善这个吗?

2 个答案:

答案 0 :(得分:1)

我想说这些函数注册到某个队列而不是让它们直接执行JavaScript。

var moveQueue = [];

function forward(){
  moveQueue.push(_forward);
}
function _forward(){
    alert("move forward");
}

function backward(){
  moveQueue.push(_backward);
}
function _backward(){
    alert("move backward");
}

与运行时相比,您将使用setTimeout和

function run(){
    var curStep = 0;
   function go(){
      moveQueue[curStep]();
      curStep++;
      if(curStep<moveQueue.length){
          window.setTimeout(go,500);
      }
   }  
}

您仍然需要解析它以找出if语句逻辑,但这是允许您控制执行速度的众多方法之一。

答案 1 :(得分:0)

Javascript没有sleep()功能,所以是的,使用setTimeoutsetInterval即可。

您可以先解析'指令',汇编一系列需要执行的操作,然后使用setInterval来安排定期调用的函数,该函数接受下一条指令并将其执行(如果没有其他指令等待处理,则清除间隔。)