捕获呼叫者';JavaScript中的s作用域
此代码与运行eval的同一作用域中的is相同:捕获呼叫者';JavaScript中的s作用域,javascript,node.js,eval,Javascript,Node.js,Eval,此代码与运行eval的同一作用域中的is相同: 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
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上工作,那也没关系
它甚至可能需要一些本机代码,尽管我没有编写本机加载项的经验。虽然我同意您应该避免使用
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());
不幸的是,这似乎是不可能的。你看过了吗?@FelixKling我需要这个,因为我正在尝试将JavaScript交叉编译到JavaScript,以添加一个wait关键字,该关键字大致相当于C#的wait,并与Q承诺一起工作。这有点难看,但除此之外,我的工作还不错。目前我只在node.js中使用它,这样我就可以通过将模块交给我的编译函数来传递通常可用于模块的所有局部变量。@OcuS一般来说,eval是邪恶的,但是有一些特殊的高级场景,在没有它的情况下,您无法复制某些功能(除非有人能找到方法这样做). 我想做的是至少封装eval的使用,这样它就不会暴露给我的组件的消费者,因为那真的很邪恶。是的@Zirak它是一个很酷、很有用的模块,但不幸的是,它似乎没有一种方法来选择我想要的范围。问题是我不知道它只是一个,它可以是作用域中的任何变量。您可以使变量成为作用域的成员吗?e、 g.
this.a=10代码>而非var a=10代码>?不,我需要将函数编译为字符串,但要让它像常规JavaScript一样工作。