2

此代码在运行 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 就可以了

它甚至可能需要一些本机代码,尽管我没有编写本机插件的经验。

4

2 回答 2

1

不幸的是,这似乎是不可能的。

于 2012-09-15T19:01:54.897 回答
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());
于 2012-08-10T13:47:03.877 回答