このコードは、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でのみ機能する場合は問題ありません。
ネイティブアドオンを作成した経験はありませんが、ネイティブコードが必要になることもあります。