Google Closure Compiler - 如何为变量创建 Extern(变量名称不能更改,因为它在 Eval 中)
Google Closure Compiler - How to create an Extern for a variable (variable name can't change as it is in an Eval)
我在 "SIMPLE_OPTIMIZATIONS" 模式下使用 Google 闭包编译器。 JavaScript 使用 "Eval" 语句,在字符串中嵌入了变量“_u”。当 Google Closure Compiler 混淆代码时,变量名称更改为 "a" 并且我得到一个错误,“_u”未在控制台中定义。我的理解是 Extern 将解决这个问题,但我不确定如何编写它。想法?
代码片段:
var FuncName = (function(){
var ht=escape(_w.location.href)
function _fC(_u){
_aT=_sp+',\/,\.,-,_,'+_rp+',%2F,%2E,%2D,%5F';
_aA=_aT.split(',');
for(i=0;i<5;i++){
eval('_u=_u.replace(/'+_aA[i]+'/g,_aA[i+5])')
}
return _u
};
return {
O_LC:function(){
_w.open('https://someurl?referer='+_fC(_ht))
}
};
})();
GoogleClosure Compiler修改后代码:
var FuncName = function() {
function a(a) {
_aT = _sp + ",\/,\.,-,_," + _rp + ",%2F,%2E,%2D,%5F";
_aA = _aT.split(",");
for (i = 0;5 > i;i++) {
eval("_u=_u.replace(/" + _aA[i] + "/g,_aA[i+5])");
}
return a;
}
escape(_w.location.href);
return {O_LC:function() {
_w.open("https://someurl?referer=" + a(_ht));
}};
}();
这很容易。您只需要一个单独的外部文件:
sampleextern.js
/** @externs */
var _u;
外部有效 javascript。参见 http://blogs.missouristate.edu/web/2013/09/12/how-to-write-closure-compiler-extern-files-part-1-the-basics/
您只能防止使用外部重命名全局变量或属性。本地人将始终重命名。您可以通过多种方式修改代码来解决此问题,包括使用函数构造函数:
new Function("_u", "... function body ...")
但我会重写代码以避免使用 eval 来构造正则表达式。这会起作用:
_u=_u.replace(new RegExp(_aA[i], "g"), _aA[i+5]);
您可能还对以下内容感兴趣:
Escape string for use in Javascript regex
有关 Closure Compiler 限制的一般文档位于此处:
https://developers.google.com/closure/compiler/docs/limitations
我在 "SIMPLE_OPTIMIZATIONS" 模式下使用 Google 闭包编译器。 JavaScript 使用 "Eval" 语句,在字符串中嵌入了变量“_u”。当 Google Closure Compiler 混淆代码时,变量名称更改为 "a" 并且我得到一个错误,“_u”未在控制台中定义。我的理解是 Extern 将解决这个问题,但我不确定如何编写它。想法?
代码片段:
var FuncName = (function(){
var ht=escape(_w.location.href)
function _fC(_u){
_aT=_sp+',\/,\.,-,_,'+_rp+',%2F,%2E,%2D,%5F';
_aA=_aT.split(',');
for(i=0;i<5;i++){
eval('_u=_u.replace(/'+_aA[i]+'/g,_aA[i+5])')
}
return _u
};
return {
O_LC:function(){
_w.open('https://someurl?referer='+_fC(_ht))
}
};
})();
GoogleClosure Compiler修改后代码:
var FuncName = function() {
function a(a) {
_aT = _sp + ",\/,\.,-,_," + _rp + ",%2F,%2E,%2D,%5F";
_aA = _aT.split(",");
for (i = 0;5 > i;i++) {
eval("_u=_u.replace(/" + _aA[i] + "/g,_aA[i+5])");
}
return a;
}
escape(_w.location.href);
return {O_LC:function() {
_w.open("https://someurl?referer=" + a(_ht));
}};
}();
这很容易。您只需要一个单独的外部文件:
sampleextern.js
/** @externs */
var _u;
外部有效 javascript。参见 http://blogs.missouristate.edu/web/2013/09/12/how-to-write-closure-compiler-extern-files-part-1-the-basics/
您只能防止使用外部重命名全局变量或属性。本地人将始终重命名。您可以通过多种方式修改代码来解决此问题,包括使用函数构造函数:
new Function("_u", "... function body ...")
但我会重写代码以避免使用 eval 来构造正则表达式。这会起作用:
_u=_u.replace(new RegExp(_aA[i], "g"), _aA[i+5]);
您可能还对以下内容感兴趣:
Escape string for use in Javascript regex
有关 Closure Compiler 限制的一般文档位于此处:
https://developers.google.com/closure/compiler/docs/limitations