在JavaScript中捕获调用者的范围

时间:2012-08-10 12:10:05

标签: javascript node.js eval

此代码与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

,那就没问题了

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

2 个答案:

答案 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());