在以下代码中,我需要变量some_var
不被Google的Closure Compiler重命名或删除。
function scopedEval(code){
var some_var = 'world' ;
return eval('('+code+')') ;
}
scopedEval('alert("hello, "+some_var)') ;
要评估的代码依赖于一些变量的存在,所以我需要它们不受影响。
我如何指示Closure Compiler这样做?
PS:
请忽略使用eval
作为不良做法的问题。这完全是另一回事。
答案 0 :(得分:1)
可能有一些Closure Compiler选项允许这类事情,但如果不这样做,我会解决这两种方式中的问题:
创建一个全局对象来存储变量,然后使用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"])');
如果由于某种原因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的两个特征,即with
和eval
感到肮脏,让您自行决定是否感到肮脏。
答案 1 :(得分:1)
一种选择是使用函数构造函数:
var scopedEval = new Function(
"code",
"var some_var = 'world'; return eval('('+code+')');");