`
renzhen
  • 浏览: 247951 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

UglifyJS压缩的一个奇怪的bug及解决办法

阅读更多
   今天遇到一个很奇怪的问题,在开发测试没有问题的JS代码,放到服务器上chrome就报错,错误为‘ReferenceError: b is not defined’,初步断定是UglifyJS压缩有问题,我们将未压缩的代码放到服务器上,发现问题消失。
   接着就要查找原因了,将压缩的代码用netbeans打开,使用ALT+SHIFT+F格式化,找到了错误的地方,下面贴出错误压缩的源码和压缩后代码。
  
$.each(['keydown','keyup','change','focus','blur'],function(i,event){
				$input.bind(event+eventNamespace,function(e){
					if(!readyToOnBlur && (event == 'blur')) return false;
					$this._trigger('on'+event, e, null);
                                       //a
				});
			});
   

    压缩后
   
a.each(["keydown","keyup","change","focus","blur"],function(a,g){
		f.bind(g+d,function(a){
			return c||g!="blur"?(e._trigger("on"+g,a,null),b):!1
			})
		});

    比较代码可以看出,第一段代码a位置后面隐含了一个return undefined,第二段的b===undefined,于是我想这样我最后加一个return true,就可以破坏这个等式,问题就可以解决了,事实证明有效。
    不过后来又传出有类似的bug,都是‘ReferenceError: b is not defined’,难道要一个个改吗?还是改UglifyJS源码修正这个问题,似乎都不是简单的事,这令我左右为难啊,终于我灵光一闪,错误是ReferenceError,表示代码里找不到该变量,而这个变量b===undefined,既然如此,我何不创建一个。想到这层,解决方案就简单了。
    我在页面开始处加了一段如下代码:
<script>
var b;
</script>

     于是问题一劳永逸的解决了。
分享到:
评论
1 楼 litson 2013-10-09  
因为是全局的

相关推荐

Global site tag (gtag.js) - Google Analytics