2015-06-16 67 views
1

在下面的代碼中,我需要變量some_var不會被Google的Closure編譯器重命名或刪除。如何指示Closure編譯器不重命名/刪除局部變量?

function scopedEval(code){ 
    var some_var = 'world' ; 
    return eval('('+code+')') ; 
} 
scopedEval('alert("hello, "+some_var)') ; 

的代碼是EVAL-ED依賴於幾個變量的存在,所以我需要他們保持原樣。

我該如何指示Closure Compiler來做到這一點?

PS:
請忽略關於使用eval是一個不好的做法的問題。這完全是另一回事。

回答

1

可能有一些關閉編譯選項,允許這種特別的事情,但做不到這一點,我會解決這個問題的兩種方法之一:

選項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的兩個功能,吸引了最多的一起礬,即witheval

+0

用'with'聲明沒問題。你只需要知道如何安全地使用它。不過,我會繼續尋找一種不改變代碼的方式。 – GetFree

+0

另一種選擇是使用函數構造函數: new Function(「code」,「return eval('('+ code +')');」); – John

1

一種選擇是使用函數構造函數:

var scopedEval = new Function(
    "code", 
    "var some_var = 'world'; return eval('('+code+')');"); 
+0

這有助於解決問題嗎? – GetFree

+0

@GetFree閉包編譯器不會更改字符串,因此函數構造函數在編譯期間將保持不變。 –

+0

這與使用'with({'some_var':'world'})''相同。字符串「some_var''沒有改變。 – GetFree

相關問題