2015-06-16 32 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

相关问题