2012-08-10 67 views
2

范围此代码为是在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。

+1

为什么你需要这个? – 2012-08-10 12:17:15

+1

你看过[vm模块](http://nodejs.org/docs/latest/api/vm.html)吗? – Zirak 2012-08-10 12:27:24

+0

@FelixKling我需要这个,因为我正在尝试将JavaScript交叉编译为JavaScript,以添加与C#的await关键字大致相当的await关键字,并使用Q promise。这有点难看,但除此之外,我的工作非常好。目前我只在node.js中使用它,所以我可以通过将模块提供给我的编译函数来传递通常可用于模块的所有本地语言。 – ForbesLindesay 2012-08-14 14:42:33

回答

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()); 
+0

问题是我不知道它只是一个,它可能是范围内的任何变量。 – ForbesLindesay 2012-08-10 16:33:35

+0

你可以让你的变量的成员范围?例如'this.a = 10;'而不是'var a = 10;'? – cjohn 2012-08-10 20:57:51

+0

不,我需要编译一个函数作为一个字符串,但它的工作方式就像普通的JavaScript一样。 – ForbesLindesay 2012-08-14 14:45:23