范围此代码为是在EVAL运行在相同的范围:捕捉呼叫者的JavaScript中
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的
它甚至可以要求一些本地代码,虽然我没有经验编写本地插件-ONs。
为什么你需要这个? – 2012-08-10 12:17:15
你看过[vm模块](http://nodejs.org/docs/latest/api/vm.html)吗? – Zirak 2012-08-10 12:27:24
@FelixKling我需要这个,因为我正在尝试将JavaScript交叉编译为JavaScript,以添加与C#的await关键字大致相当的await关键字,并使用Q promise。这有点难看,但除此之外,我的工作非常好。目前我只在node.js中使用它,所以我可以通过将模块提供给我的编译函数来传递通常可用于模块的所有本地语言。 – ForbesLindesay 2012-08-14 14:42:33