我正在开发一个包含大量用户生成代码的项目(受此视频http://vimeo.com/36579366启发)。我想要做的是 eval() 一块用户输入代码,并在每次定义 var 时运行一个函数,或者乘以 2 个变量,或者发生其他一些操作。
有没有办法在 JS 中做到这一点?
显然,我可以在该字段中搜索“var ...”,然后阅读接下来会发生什么,然后对这些信息做任何我需要做的事情,但是,出于多种原因,我宁愿“合法地”在哪里做我实际上对正在执行的事情做出反应。
我正在开发一个包含大量用户生成代码的项目(受此视频http://vimeo.com/36579366启发)。我想要做的是 eval() 一块用户输入代码,并在每次定义 var 时运行一个函数,或者乘以 2 个变量,或者发生其他一些操作。
有没有办法在 JS 中做到这一点?
显然,我可以在该字段中搜索“var ...”,然后阅读接下来会发生什么,然后对这些信息做任何我需要做的事情,但是,出于多种原因,我宁愿“合法地”在哪里做我实际上对正在执行的事情做出反应。
您可以在某些版本的 Javascript(也称为代理)中使用Intercession API 。由此,您可以通过编写自己的代码来重新定义对象发生变异时会发生什么。
如果这不可能,但您事先知道变量的名称,您可以使用setter、getter或Object.watch的 polyfill来实现相同的效果。
如果您不知道变量名称是什么,我建议您通过像Esprima这样的解析器运行用户定义的 Javascript以获得 AST。当您看到正在定义(或提升)的变量时,您可以将任意语法直接注入 AST,然后编译回工作代码。您将寻找带有"type": "VariableDeclaration"
.