一个“引号”引起的血案!外一则编码引起的超诡异问题
今天就遇到了一个超级诡异的问题,在一个JavaScript函数中找不到另一个函数,大体就是这样的
<script type="text/javascript" src="bFun.js"></script>
function A()
{
B()
}
bFun.js这样定义
.....(some functions)
B()
{
....
}
...(some functions)
然而执行到B()的时候提示“没有对象”。郁闷啊,B()明明就是定义了的!还有那些地方有错误呢?
后来高手过来帮忙调试,发现在这个之前还有页面的错误,我忽略了,是一处提示没有括号的错误。
第一眼还是没有看出来怎么回事,反复查看以后,发现,原来是掉了一个引号~~~正如下面的样式
...
string str=a+"some text"+ p + OtherText";
就是OtherText前面少了一个引号,造成了解析器误以为OtherText以后的部分都是字符串类型,当然b()在OtherText之后,当然就找不到问题了~~~~
真是诡异。
问题解决之后,才发现,原来,解释性语言那么麻烦~~~还是静态编译的好一些。想想,如果JavaScript有某种语法检测工具那该多好啊~~~或许我还没有发现吧。
另外一个诡异的问题来自于同事,程序当中有时候要对字符串进行比较,类似于以下的:
if(step=="步骤")....
当他调试到step的时候,纵使step的值是“步骤”,if都不跳转到应该执行的代码!!
怎么回事呢?
原来这个代码的源代码的编码在vss里面出了问题,checkout之后的编码也不是正常的编码,造成了"步骤"编译以后的二进制值和由其他地方传过来的step的二进制值不相同,而机器比较的时候不是比较字面的,而是直接比较内存中的值,这就造成了异常诡异的BUG。
将源代码重新编辑保存就对了。
看来,第一,在写代码的时候,一些大量常用的字符串,能够放在一个固定的文件里面,所有需要用到的时候都从那儿提取,就会大大减少类似的错误。第二,程序中的字符串如非必要,还是以英文为好。