在下面的代码中,我需要变量 some_var
不被 Google 的 Closure 编译器重命名或删除。
function scopedEval(code){
var some_var = 'world' ;
return eval('('+code+')') ;
}
scopedEval('alert("hello, "+some_var)') ;
要评估的代码依赖于一些变量的存在,因此我需要保持它们不变。
我如何指示闭包编译器执行此操作?
PS:
请忽略使用 eval
是一种不好的做法的问题。这完全是另一回事。
最佳答案
可能有一些闭包编译器选项专门允许此类事情,但如果做不到这一点,我会通过以下两种方式之一解决问题:
选项 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
ed 代码,那么您可以使用 with
来解决这个问题。在这种情况下,您不需要将 vars
声明为 extern。
function scopedEval(code){
var vars = {
"some_var": "world"
};
with(vars) {
return eval('('+code+')');
}
}
scopedEval('alert("hello, "+some_var)');
我将让您自行决定是否使用 JavaScript 中最受批评的两个功能(即 with
和 eval
),是否觉得肮脏。
关于javascript - 如何指示闭包编译器不重命名/删除局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30857142/