[英]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选项专门允许这种事情,但是如果失败,我将通过以下两种方法之一解决问题:
创建一个全局对象来存储您的变量,然后使用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']
对您不起作用,而您需要在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的两个吸引最多硫酸的功能( with
和eval
是否感到脏,我都会自行决定。
一种选择是使用函数构造函数:
var scopedEval = new Function(
"code",
"var some_var = 'world'; return eval('('+code+')');");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.