【问题标题】:slow down execution of javascript's eval减慢 javascript eval 的执行速度
【发布时间】:2011-08-03 09:33:11
【问题描述】:

我创建了一个小机器人,例如基于 javascript 的 Karel 机器人 (Wikipedia)。

Karel4Web

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

用户可以编写一个javascript程序来控制机器人,然后通过javascript的“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”堆栈并继续向基本堆栈添加操作。

有什么改进的办法吗?

【问题讨论】:

  • 你试过在“;”上分割线吗或者 \n 然后一个一个地传递给 eval
  • 我想过,但我还没有尝试。 if 条件会发生什么?
  • 在这种情况下,您还必须为 if 、 while 循环实现一些东西。您可以将它们组合成单个代码块,但它不会显示动画。
  • 编辑了您的帖子以为您修复 URL,因为它们显然是相关的,所以应该是正确的链接
  • 您是否打算使用嵌套的 while 和 for 循环? while( while() )

标签: javascript timer eval karel


【解决方案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 语句的逻辑,但这是允许您控制执行速度的众多方法之一。

【讨论】:

    【解决方案2】:

    Javascript 没有 sleep() 函数,所以是的,使用 setTimeoutsetInterval 是要走的路。

    您可以先解析“指令”,组装一组需要执行的操作,然后使用setInterval 安排定期调用的函数,该函数接收下一条指令并执行(或清除间隔,如果没有更多指令等待处理)。

    【讨论】:

    • 这大致就是我正在做的事情(见js代码,我已经更新了问题)。问题是我必须实现诸如 while 循环、for 循环、函数等的东西,这些东西工作量很大,而且容易出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多