如何指示Closure Compiler不重命名/删除局部变量?

时间:2015-06-16 00:40:33

标签: javascript web-deployment google-closure-compiler

在以下代码中,我需要变量some_var不被Google的Closure Compiler重命名或删除。

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

要评估的代码依赖于一些变量的存在,所以我需要它们不受影响。

我如何指示Closure Compiler这样做?

PS:
请忽略使用eval作为不良做法的问题。这完全是另一回事。

2 个答案:

答案 0 :(得分:1)

可能有一些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']无法为您工作,并且您需要在some_var ed代码中使用eval,那么您可以使用with绕过这个。在这种情况下,您不需要将vars声明为extern。

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

我会根据您使用JavaScript的两个特征,即witheval感到肮脏,让您自行决定是否感到肮脏。

答案 1 :(得分:1)

一种选择是使用函数构造函数:

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