【发布时间】:2012-09-16 03:01:54
【问题描述】:
此代码在运行 eval 的同一范围内工作:
function compile(fn) {
//Actually calls fn.toString() then compiles some es.next type
//features to current versions of es.
return 'function () { return a; }';
}
function runAsStringA() {
var a = 10;
var compiled = eval(compile());
return compiled();
}
这不起作用,但符合我在理想世界中想做的事情:
function compile(fn) {
return eval('function () { return a; }');
}
function runAsStringA() {
var a = 10;
var compiled = compile();
return compiled();
}
基本上我需要一种在父级范围内进行评估的方法。
我试过了:
function compile(fn) {
return eval.bind(this, 'function () { return a; }');
}
function runAsStringA() {
var a = 10;
var compiled = compileSpecialFunction()();
return compiled();
}
问题是编译后的函数在作用域内没有得到a。
我正在尝试在 node.js 环境中使用它,所以如果解决方案仅适用于 node.js 就可以了
它甚至可能需要一些本机代码,尽管我没有编写本机插件的经验。
【问题讨论】:
-
你看过the vm module吗?
-
@FelixKling 我需要这个,因为我正在尝试将 JavaScript 交叉编译到 JavaScript 以添加一个 await 关键字,该关键字大致相当于 C# 的 await 并与 Q Promise 一起使用。这有点难看,但除此之外我已经让它工作得很好。目前我只在 node.js 中使用它,所以我可以通过将模块提供给我的编译函数来传递通常可用于模块的所有本地变量。
-
@OcuS 一般来说,eval 是邪恶的,但是在一些特殊的高级场景中,如果没有它,您将无法复制某些功能(除非有人能找到一种方法)。我要做的是至少封装 eval 的使用,这样它就不会暴露给我的组件的消费者,因为那真的是邪恶的。
-
是的@Zirak,这是一个很酷且有用的模块,但不幸的是似乎没有办法以我想要的方式选择范围。
标签: javascript node.js eval