今天遇到一个很奇怪的问题,在开发测试没有问题的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>
于是问题一劳永逸的解决了。