此代码与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
,那就没问题了它甚至可能需要一些本机代码,尽管我没有编写本机附加组件的经验。
答案 0 :(得分:1)
不幸的是,这似乎是不可能的。
答案 1 :(得分:0)
虽然我同意你应该避免使用eval
,可能veal
(正如我的拼写检查所示),这可能有所帮助:
function compile(a) {
return eval('(function(a) { return a; })').call(this, a);;
}
function runAsStringA() {
var a = 10;
var compiled = compile(a);
return compiled;
}
console.log(runAsStringA());