可能有一些關閉編譯選項,允許這種特別的事情,但做不到這一點,我會解決這個問題的兩種方法之一:
選項1
創建一個全局對象來存儲您的變量,然後使用js_externs
選項,以防止它被改寫的:
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @js_externs vars
// ==/ClosureCompiler==
vars = {};
那麼你可以申請字符串屬性到這個對象應該保持不變
function scopedEval(code){
vars['some_var'] = 'world';
return eval('('+code+')');
}
scopedEval('alert("hello, "+vars["some_var"])');
選項2
如果由於某種原因vars['some_var']
不會爲你工作,你需要使用some_var
字面上eval
版代碼中,然後就可以用with
來解決這個問題。在這種情況下,您不需要聲明vars
作爲extern。
function scopedEval(code){
var vars = {
"some_var": "world"
};
with(vars) {
return eval('('+code+')');
}
}
scopedEval('alert("hello, "+some_var)');
我把它留給你的判斷力,你是否覺得髒使用JavaScript的兩個功能,吸引了最多的一起礬,即with
和eval
。
用'with'聲明沒問題。你只需要知道如何安全地使用它。不過,我會繼續尋找一種不改變代碼的方式。 – GetFree
另一種選擇是使用函數構造函數: new Function(「code」,「return eval('('+ code +')');」); – John