var引发的飘忽不定的现象

javascript是一种非常实用的脚本语言,可以令网页的界面产生各种漂亮的效果。然而,要想用好它,却不是那么容易的事情。由于javascript是一种宽松类型的语言,因而也是一种十分灵活的语言。它无需明确的数据类型,大多数情况下,它会根据需要自动进行类型转换。一个函数既可以返回数,又可以返回数组,当然,它还可以返回任何其它类型的数据。
然而这种灵活性的代价就是没有很好的编辑工具,没有好用的调试工具。最糟糕的莫过于其“开发易出错"的特点。最近深刻体会到了这个问题,那就是小小的var引发的一种飘忽不定的想象。
大家知道,在javascript中,用var来定义一个变量。然而,由于这不是必须的,所以有时候偷懒,就省略了。然而,当不用var来声明时,一个变量默认的是全局变量。由于学习javascript的时间并不长,所以没有系统的对其钻研,这一条我并不知道,至少没有什么印象。这在大多数情况下好像没发生什么问题。但正是因为大多数情况下不出现的问题让我碰上了,所以问题才显得那么飘忽不定。
在一个实际问题中,由于一段代码十分常用,所以提取出来封装了一下,里面有一个for循环里面的计数器变量,我习惯性的用i来表示,但是没有用var来限制它,于是他成了一个全局变量。但是,该函数可以处理绝大部分的同类型问题,我也在很多地方使用该函数,为此还颇为自豪,梦想什么时候自己也出一个函数库,字少可以自己用。没想到,最近困扰我一个礼拜的问题竟处在它身上。
因为javascript的变量可以代表函数,所以我在这个函数的参数里面用了函数变量作参数,带点其他语言中的回调,接口或者委托作用的意思。因为大部分情况下,我们在其他地方的循环中,都会对己拴变量赋初值,因而基本上不会出太大问题。然而,正好我的一个调用函数里面也用到了一个i作为计数变量,而且也正好没有用var来限制。因为他们调用的关系,所以他们的i值便在运行中相互产生影响。因为参数都在不停的变动,所以这种问题并不是每次的出现(有点时间序列的感觉,两次相同的操作,因为先后发生的顺序不一样,到这里状态也改变了)。在办公室好好的,到家里就出问题了,回到办公室又好了。向别人请教,结果每次都不能给别人展示遇到的问题,而自己一调试就又出来了。好像是上帝之手在作弄我,给我的感觉就是一种飘忽不定的感觉。
终于今天,在调试后的时候,准确的捕捉到了这个问题。一路跟踪下来,发现调用函数出的计数变量i每次都“不走寻常路”,一会儿变得快,一会儿变得慢。至此我才抓住了这之老鼠的尾巴,哈哈,今天很兴奋呀。
静下心来思考,以后要养成良好的编程习惯。对于javascript,有一点那是肯定的,就是“打死我也不能再省略var了”。

posted @ 2007-12-11 15:25  Sangplus  阅读(189)  评论(0编辑  收藏  举报