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