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 に答える