在用google closure compiler编译JS文件时发现eval无法通过,有谁知道怎么解决这个问题啊?
下面为要用closure compiler编译的测试JS代码,详细见资源文件。(function(){
    var Effects = window.Effects = function(){
        var transTotal = 10;
        this.transition = function (maskID, maskTime){
            if (maskID <= transTotal) {
                var maskFunName = "mask" + maskID;
                eval(maskFunName)(maskTime);
                
                //这里因为使用了eval方法所以造成无法通过google closure compiler编译,如何才能使编译正常通过?
                
            } else {
                mask1(maskTime);
            }
        }
        function mask1(maskTime) {
            alert("mask1: " + maskTime);
        }
        function mask2(maskTime) {
            alert("mask2: " + maskTime);
        }
        function mask3(maskTime) {
            alert("mask3: " + maskTime);
        }
        
        /*
      .
      .
        .
        ...下面还有很多mask函数.
        */
       
    };
})();var masker = new Effects();
masker.transition(3, 2);
masker.transition(30, 8);

解决方案 »

  1.   

    把eval(maskFunName)(maskTime);换成
    var fn = eval(maskFunName);
    fn(maskTime);
      

  2.   


    我没试你代码是正确的,本来就没问题,你要通过google的封闭编译,那就别用eval。很可能google不推荐使用eval函数,因为它具有潜在危险验证google是否对eval有限制,可以把eval替换成简单的语句eval('alert("ok")'),看是否依旧有警告。我建议你不要去使用eval函数:(function(){
        var Effects = window.Effects = function(){
            var transTotal = 10;
            this.transition = function (maskID, maskTime){
                if (maskID <= transTotal) {
                    var maskFunName = "_mask" + maskID;
                    this[maskFunName](maskTime);
                } else {
                    this._mask1(maskTime);
                }
            }
            this._mask1 = function (maskTime) {
                alert("mask1: " + maskTime);
            }
            this._mask2 = function (maskTime) {
                alert("mask2: " + maskTime);
            }
            this._mask3 = function (maskTime) {
                alert("mask3: " + maskTime);
            }
            
            /*
                 .
                 .
                .
                   ...下面还有很多mask函数.
            */
           
        };
    })();var masker = new Effects();
    masker.transition(3, 2);
    masker.transition(30, 8);
      

  3.   

    大哥多谢了,按照你这种写法已经可以通过google closure compiler编译了。同时你也为我解决了这个问题。这里还有一点很是不解,为什么在我之前的写法中通过eval(maskFunName)(maskTime);可以访问下面的mask函数, 但是通过this[maskFunName](maskTime);或window[maskFunName](maskTime);确无法访问下面的mask函数。
      

  4.   


    先说一下:
    this['mask1'] 等价于 this.mask1举例说明一下:
    this['mask1'](maskTime)会在当前函数this指向的对象中寻找mask1函数而你是通过在Effects函数内定义的function mask1(){}函数,是个局域函数,且并未和this对象存在任何关联。因此window['mask1']和this['mask1']都是不存在的
      

  5.   

    如此说来,如果要通过函数名调用函数(排除使用eval方法)就只能将mask函数通过this都定义在Effects里面了。eval方法不知道是如何取到mask局域函数的。