JavaScript 评估,用于在某种隔离环境中的表达式
JavaScript eval for expressions in somewhat isolated environment
>我有一系列指令,如下所示:
[
{"name": "a", "expr": "1"},
{"name": "b", "expr": "4"},
{"name": "c", "expr": "a * b + 100"},
{"name": "a", "expr": "a - 5"}
]
我想使用在浏览器中运行的 JavaScript 引擎执行它们,然后访问结果。
显然,尝试第一次尝试只是
eval(inst.name + " = " + inst.expr);
事实上,它可以工作,但它会污染全局window
命名空间并冒着冲突的风险。
这是我到目前为止所拥有的:
var Memory = (function() {
function Memory() {}
Memory.prototype.evalExpr = function(expr) {
return eval(expr);
};
return Memory;
})();
var mem = new Memory();
然后,使用以下方法执行每条指令inst
:
mem[inst.name] = mem.evalExpr(inst.expr);
这半有效,但我必须更改所有指令以在所有变量名前面加上 this.
,即:
[
{"name": "a", "expr": "1"},
{"name": "b", "expr": "4"},
{"name": "c", "expr": "this.a * this.b + 100"},
{"name": "a", "expr": "this.a - 5"}
]
有没有一种快速的方法可以在对象中执行读取操作,而不需要在变量名称前面加上this.
?动态正确修改表达式需要构建一个成熟的表达式解析器——换句话说,将像 jison 这样的相对重量级的库插入到 project 中会更容易(并尝试接受它。
这与其他"沙盒 JavaScript 评估"问题有些不同,因为:
- 我
真的不需要适当的沙盒,我执行的代码足够可信,我只想将所有这些生成的变量放在一个隔离的空间中(例如,稍后轻松地对其进行
JSON.stringify
等(。这个处理浏览器中的JavaScript引擎,而不是像node.js这样的独立引擎。
这个问题的基石不是沙盒,而是如何访问属性(即 a
, b
, ...在 JavaScript 中将给定对象(例如 mem
(作为局部变量,即没有任何前缀,如 this.a
或 mem.a
。
结果发现,解决方案是臭名昭著的with
声明(就像eval
一样,它也经常被某些人"认为有害"(。然而,在这种确切的情况下,它可以完美地完成工作:可以使用它动态地计算任意表达式:
function VM() {
this.mem = {};
}
VM.prototype.varSet = function(varName, expr) {
var _t;
with (this.mem) { _t = eval(expr) };
this.mem[varName] = _t;
};
vm = new VM()
因此,执行指令很容易:
insts.forEach(function(inst) {
vm.varSet(inst.name, inst.expr);
});
获取个人结果:
vm.mem.a // => -4
并将所有结果一起作为适当的纯JavaScript对象,例如,导出为JSON字符串:
JSON.stringify(vm.mem) // => "{'"a'":-4,'"b'":4,'"c'":104}"
相关文章:
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- 难以访问的JS环境中的语法错误
- 从控制器继承了隔离的作用域以生成可重用的指令
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 键入环境安装不起作用
- 在node.js中设置Apache环境变量
- AngularJS指令隔离作用域
- 访问多个指令的隔离作用域
- 限制npm依赖模块's require(隔离)的用法
- 能够在指向本地环境的浏览器中设置JavaScript断点
- Rally SDK外部开发Rally环境未定义
- 如何在词法环境中管理块范围
- 可以'无法正确访问NODE_ENV环境变量,这是NODE.js的错误吗
- 如何在隔离作用域指令中访问此作用域变量
- 无法在我的示例plunker中使用继承/隔离的范围概念
- 使用Lodash从JSON对象获取特定于环境的配置
- 如何在Meteor中使每个环境都不那么不同
- 什么's的作用;隔离“;在V8中?以及如何可能使“;隔离“;孤立地
- moment.js年份/数字格式,阿拉伯语言环境
- JavaScript 评估,用于在某种隔离环境中的表达式