2012-08-10 72 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