簡體   English   中英

如何指示Closure Compiler不要重命名/刪除局部變量?

[英]How to instruct Closure Compiler not to rename/remove a local variable?

在以下代碼中,我不需要Google的Closure Compiler重命名或刪除變量some_var

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

要評估的代碼依賴於一些變量的存在,因此我需要保持不變。

如何指示Closure Compiler執行此操作?

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

可能會有一些Closure Compiler選項專門允許這種事情,但是如果失敗,我將通過以下兩種方法之一解決問題:

選項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']對您不起作用,而您需要在eval代碼中直接使用some_var ,則可以使用with來解決此問題。 在這種情況下,您無需將vars聲明為extern。

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

無論您使用JavaScript的兩個吸引最多硫酸的功能( witheval是否感到臟,我都會自行決定。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM