繁体   English   中英

Google Closure编译器-如何为变量创建外部变量(变量名称不能像在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 Closure编译器。 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))
  }
};
})();

Google Closure 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));
  }};
}();

很简单 您只需要一个单独的externs文件:

sampleextern.js

/** @externs */

var _u;

Externs是有效的javascript。 参见http://blogs.missouristate.edu/web/2013/09/12/how-to-write-closure-compiler-extern-files-part-1-the-basics/

您只能阻止使用extern重命名全局变量或属性。 当地人将始终被重命名。 您可以通过多种方法修改代码以解决此问题,包括使用函数构造函数:

new Function("_u", "... function body ...")

但是我会重写代码以避免使用eval构造正则表达式。 这将工作:

_u=_u.replace(new RegExp(_aA[i], "g"), _aA[i+5]);

您可能还会对以下内容感兴趣:

在Javascript正则表达式中使用的转义字符串

有关Closure Compiler限制的常规文档在这里:

https://developers.google.com/closure/compiler/docs/limitations

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM