Javascript:跟踪使用eval()创建的对象

时间:2014-04-05 17:06:24

标签: javascript eval

我写了一个用于教授Javascript(和使用Brython的Python版本)的“Karel the robot”。我想让用户访问整个Javascript语言,而不是只有一个迷你语言,就像机器人的原始卡雷尔一样。为此,我只使用eval()来评估用户程序。 (*请参阅http://reeborg.ca/learn_js.html以获取我的第一个版本[完成时将替换为较新版本]和http://reeborg.ca/learn_js_new_dev.html以获取更新版本。我正在编写一个新版本,因为原始版本有一个版本内存泄漏导致浏览器崩溃。*)

如果我可以跟踪用户脚本创建的对象/变量,那么增强用户体验会很有帮助。

我能想到的一个粗略的方法是预处理脚本并尝试识别任何明显的变量(用var关键字或函数声明)但我想知道是否有一个简单的更多没有编写JavaScript解释器的可靠方法。 (也许黑客攻击jshint / jslint并在脚本上运行它来识别变量......)

编辑:

以下是我实际进行评估的代码。由于它是在一个函数内完成的(并强制使用变量声明),也许这使我更容易完成我希望做的事情。

RUR.runner.eval_javascript = function (src) {
// Note: by having "use strict;" here, it has the interesting effect of requiring user
// programs to conform to "strict" usage, meaning that all variables have to be declared,
// etc.
"use strict";  // will propagate to user's code, enforcing good programming habits.
// lint, then eval
editorUpdateHints();
if(editor.widgets.length === 0) {
    libraryUpdateHints();
    if(library.widgets.length !== 0) {
        $('#library-problem').show().fadeOut(4000);
    }
}
RUR.reset_definitions();
eval(src); // jshint ignore:line
};

4 个答案:

答案 0 :(得分:0)

如果你没有写一些东西来监控var空间,可以想出一个跟踪事物的简单方法(可能有一种与控制台集成的方式)。

然而,这可能会有所帮助: http://repl.it/languages https://github.com/replit

答案 1 :(得分:0)

“没有编写javascript解释器”

如果您考虑使用其他人的JavaScript解释器,请查看Narcissus

答案 2 :(得分:0)

evaled脚本可以访问两个范围,即执行eval和全局对象的函数。您可以在运行脚本之前扫描所有这些对象,记下所有变量名称,然后再进行相同的扫描,差异就是脚本引入的变量。

答案 3 :(得分:0)

@Jack Allan是对的,你会做这样的事情:

var windowvars = new Array();
var evalvars = new Array();

for (i in window){
  console.log(i);
  windowvars.push(i);
}

eval('var aaa = 1;');

for (j in window){
  console.log(j);
  if (windowvars.indexOf(j) < 0){
    evalvars.push(j);
  }
}