More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  所以然ProfileFriendsBlogMore Tools Explore the Spaces community

所以然

View space
雅克
View space
(no name)

January 04

他们曾走进我的生活

      这个其实是lp的blog上的一个影集的名字,觉得不错,所以盗用过来。昨天无意中跟lp提到了圆圆,很兴奋的聊了半天,最后是一阵唏嘘。最近一段时间发生了很多事情,自己也不知道怎么了,变得特别容易怀旧,动不动就能想起以前的朋友,以前发生的事情,甚至以前曾走进我生活的狗狗们......

老虎
性别:雌
毛色:黑
种族:狼狗,据说是比较纯的黑贝

      老虎是我真正接近的第一个狗,之前在乡下老家的时候家里有一只,但是没怎么和它玩过。老虎是我来北京前一年到我们家的,来的时候它才不到一岁,还是它的童年,哈。那时刚搬过新家,从我姨家里把它弄了过来,来时老虎还很怕生,只跟喂它食的我老爸老妈亲近。老弟也是小孩,所以跟同是小孩的老虎总有那么点别扭。我也不在家住,所以老虎和我最不熟。但每次周末回家住都小心翼翼的和它玩好久,并且经常偷偷的喂它一些爸妈不让我喂的“美味”,花生、糖果之类的。老虎这家伙也吃人家嘴软,被这么“贿赂”了几次之后就和我成了哥儿们了。

      每次周末回家它都跑出好远来迎接,一下跳起来,恨不得钻到我怀里。最喜欢干的事情就是吃过饭牵着老虎到门外的荒地嬉闹,看着它耍宝,逗它上蹿下跳。不过很快不得不离开家乡来北京了,总是担心下次再回家的时候老虎会把我给忘了。不过这些担心都是多余的,在北京的这几年里每年最多回家一两次,但是每次回去老虎都能一眼认出我来,兴奋的跑过来和我亲近,蹲下抱起它,直到后来它足够大了,抱不动了,只能抱抱它的脖子。在那一刻真的不觉得它是一只狗。

      最近一次回去,虽然老虎还是一如既往的一下就认出了我,可我发现老虎真的老了,行动有些迟缓,眼神也不好使,扔个花生给它,在空中它总衔不住了。并且前腿和肚子衔接的地方长了一个很大的肉瘤,走路有点拐,毕竟它已经9岁多了,相当于人类的70岁。不知道什么时候这个老朋友可能就离我而去了,想到这里心里总特别不是滋味。

      但是,发生了更让人心里难受的事情,前些时候老爸打电话说,老虎跑了,老爸带它去兽医院想给它做掉那个肉瘤,老虎害怕了,一下挣脱链子逃跑了,兽医院离家很远,爸妈一晚没睡给老虎留门,可是,它没有回来,连着好几天都没有回家,至到现在......只能假装坚强,安慰了极度伤心的老爸老妈,可自己心里也空落落的,老虎!你现在哪里?过的好么?

小白
性别:雌
毛色:白
种族:本地小狮子狗

      毕业了一段时间,和pho,ssy一块儿住,厌倦了晚上一下班回到家就游戏的状态,小白于是出现在我们生活中。和pho在物美购物出来发现小白躺在一个摇篮似的小窝里,很乖的一副样子,pho和我都被这家伙打动,三下五除二就交了人家钱把它带回家,其实小白本不叫小白,卖的人跟我们说它叫小葵,受蜡笔小新的影响,所以我们决定把它改名叫小白。

      第一次自己养狗,并且第一次在楼房里养狗,才知道,狗狗虽然可爱,但要养好它,实在要花很多代价的;不过有我和pho这两个蹩脚的养狗人照顾,小白还是一天天的成长起来了。可能是长期在家独自呆着的缘故吧,小白长大以后变得不乖了,经常有些狂躁,它很喜欢和pho在屋里追逐,呵。有时会钻到pho的屋子里搞破坏,然后就被pho揪到椅子背上罚站,趴在椅背上动都不敢动,缩头缩脑的。我对小白还是一贯以怀柔为主,会经常训练它,教它学“握手”,不过小家伙总喜欢偷懒。小白比起家里的老虎,那生活简直就是生活在天堂,吃的都是狗粮,住一个大客厅。

      跟小白一起生活了一段时间以后,习惯了每天扫它拉的客厅里到处都是的大便,习惯了下班后和pho逗它满屋乱窜,习惯了揪着它的耳朵罚它站椅背儿,习惯了喂它吃自己吃的肠......当一切都成为习惯的时候,感情也就滋生出来了,小白成了生活的一部分。但是,生活总是充满了变化,由于工作关系,pho和我还有ssy不得不分开了,随着这个临时家庭的分裂,小白的去留也成为了问题,最终决定把小白送人。在水木上送狗还是很强手的,很快有了要收养的人。送小白走的前一天晚上,下班了,它很机灵的凑过来跟我玩,从冰箱里拿出来它爱吃的肠,喂它,小白很卖力的吃,它不知道明天要到别的地方去了,拍拍它的头,不敢再看它的眼睛。不知道小白后来的主人是不是对它好,还给不给它吃它爱吃的肠。这个小生灵就这样从我生命中淡出了......


圆圆
性别:雌
毛色:白
种族:小玩具狗(虽然后来长的挺大的)

      在回龙观住的时候,lp说了好几次想买只狗,不过有了上次养小白的经验,就一直劝阻了她,直到我们一次在五道口碰到了圆圆。圆圆和她的兄弟姐妹们在一个小纸箱里打闹嬉戏,她是表现最活跃的一个。lp实在走不动了,被小家伙吸引,我也再次动了爱心,和lp一拍即合,把小圆圆带回了她的新家,哎,真不知道这对她是福还是祸......

      小圆圆是我见过最聪明的狗,我和lp从训练她听名字到她直到自己叫什么只用了半小时,她的聪明从她眼神里可以看的出来,她总是喜欢歪着脑袋看人,眼神中充满了好奇。刚来我家的时候我和lp总是被他逗得前仰后合,也总是给她梳洗打扮,给她照个人写真,她也很是配合,乖巧又聪明的美女狗,这是我和lp给圆圆的评价。记得第一次带她下楼遛弯的时候,她就像一个刚见到这个大千世界的孩子,对所有的东西都充满了好奇,绿草红花乃至地上的烟头都成了她探讨的对象,因为她太小了,我们走的时候她就飞奔跟着我们,耳朵向后背着,虎虎生风,哈。

      第一次给圆圆洗澡的时候,可能她不习惯吧,洗完了就生病了,趴在她的垫子上耷拉脑袋不起来,lp和我都愁坏了,带她去医院看病,过秤,还不到1公斤的小家伙,给了她一针,拿了些药,真怕她跟其他路边买的猫狗一样就这么一命呜呼了,可能跟我们有缘分吧,圆圆神奇的好了起来,恢复了她的灵性。

      圆圆确实带给了我们很多快乐,可是她大多数时间得到的却是孤独和寂寞。由于我们都没有太多的时间配圆圆玩,大多数时间她都自己在客厅里溜达,看到我下班时她那盼望的眼睛就能知道她的感受了。可那段时间我心情不知道为什么特别差,动不动就拿圆圆出气,搞得她见到我又想亲近又怕,现在想想,挺后悔的。不过后来更过分了......

      因为工作的关系,不得不出差去兰州了,在兰州这段时间里,lp一人待在这大房子里,只有圆圆陪她。每次在兰州一个人的夜里心里都像猫抓一样难受,想回去陪lp,想她在那边的孤独和寂寞,真想飞回去。后来听lp说,那段时间多亏了圆圆,圆圆很乖的陪着她让她不是特别的寂寞,多么可爱的生灵啊!

      而后来lp也要放暑假了,于是我买了两大包狗粮接了两大盆水给圆圆,把她锁在了空荡荡的屋子里。现在想起来真是残忍,让她自己在这里囚禁了两周。等到后来回来的时候,看到她,她的眼神已经不再是灵性和乖巧了,仿佛得了抑郁症,狂躁不堪。当时心里真是一酸,这个可爱的小生命被我折磨成这个样子,心想以后要好好的待她了。

      可是,天不遂人愿,由于种种原因必须搬家跟别人合住了,意味着又要和这个小精灵分开了。很不情愿的到水木上找好心的收养人,一切都联系好了之后,就在那人来接走圆圆的时候,那人却反悔了,说圆圆太大了。无语,想再找人,可时间来不及了,只能把圆圆送了宠物医院,托那里给她找一个好的新主人。送出圆圆的那一瞬间,眼泪在眼眶打转了好久,她在我身后狂叫,不知道是同样的不舍我还是不适应新环境。在我心里是一万个对她不起,可是,又能怎么样呢?

      现在静下来想想,这些出现在我生活中的狗狗们,它们给我带来了欢乐,它们丰富了我的生活,可是却没有一个能陪我走到现在,为什么生活中偏偏会有这么多的不如意又不得不去做的事呢?还是自己不够坚持,抑或不够勇气和自信?或许真的该好好检讨了。只是这些曾出现在我生命中的朋友们,你们现在还好么?我真的想你们了......

September 04

音乐 珠子

  这段时间的工作终于要告一段落了,可以把耳机塞上让心灵得到一丝放松了。记得前些天在出租车上听到了几句张惠妹的《可以抱你么宝贝》,当时神经就被触动了一下,翻出来听,这次被触动的不止是神经了,以往的事情仿佛被一下子翻了出来,心绪回到了八年前刚来北京上学的时候......

现在自己真的是越来越迟钝了,一些回忆需要现实中的钩子才能勾起来,很多时候音乐能充当这种钩子。索性把这些音乐当成珠子,串起来,串成一段回忆的链子,让回忆不再凌乱。

《超越梦想》----汪正正。刚入校军训的时候,宿舍什么都没有,休息的时候最休闲的方式就是看电视了,cctv5的片花总放这个音乐,结识新朋友的兴奋加上对新生活的兴趣,辛苦的训练完了的时候,端着从食堂打来的饭,和室友一起边聊边看电视,偶尔喊上两嗓子,让这首歌成为这段时间的记忆。

《可以抱你么宝贝》----张惠妹。第一次感受北京的冬天,有暖气的宿舍,有暖气的教室,还有那学的不太懂的高数,总让人昏昏欲睡。这首歌的旋律正应了那时候的心情,虽然并没有失恋,但那种有些伤心的旋律经过歌手缓缓的演绎,仿佛给那段时间加上了一块深深的烙印。

《光阴的故事》----罗大佑。大学的第一个假期,一学期没怎么出过校门,和同宿舍兄弟们约好去西单逛逛,买些东西回家过年,还记得,天有些阴,时不时还下点小雪,第一次做地铁,还和兄弟们走失了,坐反了方向,哈,这首歌是pho很喜欢的并且经常唱,慢慢的也喜欢了这缓缓的怀旧的旋律了,每次听到这熟悉的旋律仿佛就能看到那阴沉的天,飘落的小雪片,年轻火热的心......

《蝴蝶花》----水木年华。第一次一个人坐火车回家过春节,走之前拿了zp的一盘盒带,借了zq的walkman,只为了打发火车上的无聊时光,一学期过去了,自己觉得考的很不理想,不知道这会对以后的四年有什么影响,不知道该不该回家跟家人交代,不知道将来会发生什么事情,一路上同样的音乐听了又听,校园民谣常有的旋律让我彻底记住了这首歌和这段心情。

《无地自容》----黑豹。上高中的时候只喜欢beyond的那种摇滚,觉得有些不羁但并不张狂。这次又是受pho的影响,可能这家伙总喜欢唱吧,呵。这种狂放的发泄可能正应了当时的心境,真想在压抑的环境中彻底的发泄。那年上大二,成绩一塌糊涂......

《雨一直下》----张宇。大学的英语课是跟zp一起上的,刚开始几学期是一个叫赵英男的女老师,这老师倒是挺有意思的老师,无奈,我是班上表现最差的学生,呵,想起来当时上英语课的场景觉的有趣,每次总担心被老师叫起来却每次被叫起来,这首歌是老师上听力课之前爱放的,多年以后和zp一起去k歌,zp还和我合唱了这个来纪念那段听写单词做presentation的日子。

《游戏人间》----郑智化。那年冬天,两年后会离开学校已成定局,不想再为这注定的结局做任何的努力,但是已经厌倦了每天对着电脑游戏的状态,最喜欢,晚上10点多钟,上自习的兄弟回来以后,相约一起去学校北门去吃串,兄弟们骑着车嘴里会哼着这首歌,但是心里已经感到,这样的日子已经不多了。

《我想我是海》----黄磊。zq买的碟,之前很少听CD的,当时整个宿舍都被这首歌感染了,经常翻出来这MTV看,不知道是被这旋律感动还是被歌词的内容引起了共鸣,“有谁孤单却不期盼......”,对未来的迷茫,随着这伤感的旋律蔓延。

《给你幸福》----任贤齐。推研不可阻挡的来了,心里很不是滋味,和zp一起搬到校外,打算躲躲这股风,同时让自己能安静的思考,zp也想找个安静的地方好好复习,这首歌是zp比较喜欢的,自己经常受别人的影响,也有可能是zp经常喜欢放这歌吧,现在听起来总能想起那间小屋,那个小破楼,还有晚上和zp一起骑车跋涉回去的那段黑咕隆咚的小路。

《除了爱你还能爱谁》----动力火车。八字班要毕业了,毕业演出很成功,也让这首歌在我记忆中留下了印象,毕业总是让人伤感的,自己也知道,这个时间也渐渐接近了,离开学校的生活会怎样,谁也不知道。

《Try to Remember》。终于轮到自己了,没有那么壮烈,没有兄弟们一起抱头痛哭的场景,可能大家都知道都会留在北京的缘故吧,只有zq要远赴重洋了,最后还是和宿舍的兄弟去送了他们夫妇一程,不是送去机场,是送他会合肥,之后他就从那里飞去米国了。毕业演出的最后是这首歌,旋律倒还悠扬,只是听了心里不是滋味,就这样,大学生活终结了。

《你怎么舍得我难过》----黄品源。每天挤着破旧的公交车,被汽油味汗臭味熏着回到回龙观的小屋,冲完凉,打开空调,打开音乐,听到的就是这个,刚工作的激情,对未来的迷茫,独自一人的孤独,好像都融到了一个个音符里,这一段段的音律也像一股股清泉洗去脑子里的烦恼。

......

不想串下去了,串下去就发现更多的珠子,这些珠子真的有魔力,能把我带回过去,再串下去可能就回不来了,优美的音乐真的是很好的东西,至少对于我来说,能带给我很多回忆,让我想起以前的事情,以前的朋友们,真挚的祝福他们!:)
 

July 09

补牢(1)

补牢(一)巴别塔

日期:2007.7
作者:老赵
备注:关于编码

1. 巴别塔的故事

1.1 话说巴别塔

    前段时间看了帅哥布拉德皮特演的《BABEL》,中文翻译叫巴别塔。这个名字出自圣经的故事,原意是原本世界大同,大家都说同样的语言,交流沟通方便,于是大家雄心勃勃齐心协力想建一座通上天堂的通天塔。这件事让上帝他老人家了解到了,为了让给人类以教训,不让他们为所欲为,于是派遣了一杆神仙下界,把众人调教的各说各话,互相听不懂了,这塔自然也没造成,后来出现这种混乱的城就叫巴别城,塔也因这个城得名。

    刚看过这故事的时候真是气愤啊,要不是这老头儿找事,现在就不用费劲去考什么Toefl,俺媳妇也不用为GRE抓狂了。在计算机的世界里,只有1和0的语言,也是世界大同,但后来为了满足可读性和区域性,不同的编码出现了,带来了新的巴别塔的问题。

1.2 问题缘起

    话说No.5同学最近在做铁通项目的客户端,遇到一个问题,就是asp.net(C#)服务器端直接发送的一段字符串,C++客户端接收的时候却总是收到一堆乱码,字符串是直接用Response.Writer()写到流里去的。赵某认为估计是两边编码不同造成的,所以就用俺以前一贯错误的关于编码的知识胡扯一番,然后印证,发现依然是乱码,真是丢人 -_-!!!

1.3 基本概念

    先说说计算机编码,计算机靠半导体硅的状态来记忆、计算和存储。这种本来不能当导体又不能当绝缘体的废料没想到居然对电流的状态有记忆作用,天生就能表示三种状态,跟二进制这种来源于我国古老的周易的思想配合的天衣无缝。从此,天下就成了1和0的天下,不是有个著名的qmd么,“世界上只有10种人,懂二进制的和不懂二进制的”。但是,每天面对这1和0,就算是懂二进制的老兄们恐怕也要抓狂了,所以编码应运而生了,就是为了让这1和0变得让人认识。

    最早的计算机编码应该是ANSI(American National Standards Institute,美国国家标准学会)提出的ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)码,老美喜欢制定标准,这个地球人都知道,但是当时他们想的标准现在看来也并不是什么标准,他们也主要是满足他们的26个英文字母以及一些控制字符的需要,脑袋不太灵光的老美掰着手指头数了数,最后决定用8位二进制码来表示他们用到的字符,这8位二进制码就称为一个字节(byte)。

    随着计算机的普及,不光老美用计算机了,比如偶们中国人民也开始走进信息化,所以那8位二进制能表示的256个字符远远达不到要求,于是比老美更有智慧的中华儿女们开始扩充编码,采用两个字节来表示一个汉字,规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。这种编码称为GB2312。到后来,再次扩充,把低字节的限制取消,只要高字节从0xA1起的都表示一个汉字,于是就出现了GBKGB18030等编码。

    一时间世界各地纷纷搞起了自己的编码,小日本儿搞蝌蚪文,中东的搞葡萄文等,后果当然不言而喻,同样的程序在不同国家地区就要有不同的版本,否则,出来的东西只有梵高他老人家能看懂,一些所谓的内码转换工具就开始盛行了。

    这时候一个叫做ISO (国际标谁化组织)的国际组织,跳出来讲话了(估计又是老美的人干的,这家伙总喜欢充老大),大意就是大家这样做是不对滴,是不利于安定团结滴,不利于长期可持续发展滴......号召大家废除各自为政的编码,统一使用以16位二进制来表示一个字符的编码,原有的ASCII码表中的可以用8位表示的字符,现在在高8位上置0,这样以来,反应快的同学或者有计算器的同学可以算了,就是可以表述256×256=65536种字符了,估计已经满足目前地球人的需要了。ISO的同志们很满意这个编码,于是把它命名为Universal Multiple-Octet Coded Character Set,简称UCS,口气很大,也就是我们通常说的UNICODE,这次人家说了,如果不够没关系,以后还可以继续扩充成四字节表示一个字符,嘿嘿,这下只有用计算器的同学能算出来了,那就是65536×65536=4294967296种了,去掉一个符号位,就能表示2亿多种字符了......

    随着网络的兴起,编码又遇到了一个新的问题,因为网络传输不像从硬盘里读数据那么稳定,有时候可能造成数据丢失,为了能表示数据之间的联系,在网络传输的时候要对现有编码的数据重新编码,所以出现了UTF(UCS Transfer Format)标准,我们常用的UTF8就是每次8个位传输数据,而UTF16就是每次16个位。

    UTF8和UNICODE的转换规则是:

Unicode 
UTF-8 

0000 - 007F 
0xxxxxxx 

0080 - 07FF 
110xxxxx 10xxxxxx 

0800 - FFFF 
1110xxxx 10xxxxxx 10xxxxxx 

    可以看出这个意图还是很明显的,反向转化的时候碰到10开头的就要往前找1110字头,否则表示有数据丢失,不过这样的编码倒是挺巧妙的,有兴趣的同学可以研究一下哈,别忘了把研究心得写下来和大家共享 :)

    一个有意思的事情就是在记事本里敲“联通”两个字,然后关闭,再打开会是乱码,这就是因为这两个字的UNICODE码是

c1 1100 0001 
aa 1010 1010 
cd 1100 1101 
a8 1010 1000 

    记事本看到字头的110和低字节的10,认为是UTF8格式的,所以自己解码就出错了。

    编码的基本概念就这些了,了解了这些基础知识对以后再碰到关于编码的问题就不会发怵了。

1.4 一点思考

    从这个编码问题不由得想到一个一直以来困扰着俺的sql server中varchar和nvarchar的问题,现在用这个编码的基本概念应该可以解释一下了:

    varchar是传统字符的存储格式,英文字符用一个字节存储,中文字符用两个字节存储。所以varchar(8),可以存“abcdefgh”和“abcd汉字”以及“我是猪头”,但是,如果你存了“老赵是个猪头”就会“系统将截断二进制数据”,然后只能存进“老赵是个”(丢失了老赵的本质特征 :))。

    nvarchar则是以UNICODE的格式存储的,就是无论什么字符都占两个字节的空间,nvarchar(8)可以存“abcdefgh”也可以存“老赵本质是个猪头”,把老赵的本质揭露的一览无余:^(

    但是好学又有点愚钝的老赵并不想满足这个结果,这样分开设计除了可能节约存储空间,以及能存储UNICODE之外,还有什么用处涅,俺猜想,这样的设计估对排序可能会有影响。因为实在没有时间去研究sql server关于排序的算法了,所以只好做了一个实验来验证。写一下实验报告哈,好久不写这东西了:)

验证sql server中varchar和nvarchar形式存储数据对字段排序的影响

【实验目的】

验证存储形式为varchar和nvarchar对字段排序的影响。

【实验环境】

操作系统:windows server 2003

数据库:Ms sql server 2005

【实验步骤】

1.建test数据库,在该数据库中建test1表,表包括id int,str varchar(4),nstr nvarchar(4)字段;

2.通过手段(用游标循环,或者笨点copy粘贴)增加表中数据至2万条;

3.update表,把str和nstr字段分别赋值“asdf”,update表,把id大于10000的数据两字段分别赋值“easf”;

4.执行

	select getdate() 
	select id from test1 order by str 	
	select getdate()

10次,记录每次执行时间;

5.执行

    	select getdate() 
    	select id from test1 order by nstr 
    	select getdate()

10次,记录每次执行时间;

6.update表,把str和nstr字段分别赋值“猪头”,update表,把id大于10000的数据两字段分别赋值“老赵”;

7.重复4-5步骤。

【实验数据】

内容及格式 1 2 3 4 5 6 7 8 9 10 平均
varchar、汉字 580 670 550 590 770 654 590 603 790 663 640
nvarchar、汉字 490 580 540 463 580 533 500 600 570 500 536
varchar、英文 610 580 644 610 510 503 520 510 500 573 552
nvarchar、英文 640 564 550 534 470 660 550 560 580 563 568

注:

1.以上时间为ms;

2.红色为去掉一个最高分和一个最低分;

【实验结论】

    通过以上实验,发现存储为varchar和nvarchar的格式对字段的排序是有一定的影响的,对于内容是汉字的字段,如果采用nvarchar形式存储,在排序的时候明显快(大概五分之一);而对于内容是英文的字段,如果采用varchar形式存储在排序的时候会稍快。

    当然也不排除随机误差的原因和数据量不够的原因以及内部优化的因素,如果想更清楚的了解二者的关系,还是需要深入了解sql server中对二者排序的算法和实现方式。

1.5 参考文献

    现在提倡保护知识产权哈,特此声明,这篇文章的思路和很多内容来源于一位网友的博客文章,地址是http://haoxiaobo.spaces.live.com,挺有才的一个前辈,写的文章也很有意思,向该前辈表达仰慕和敬意:),如果有朝一日这篇文章被转载,一定请把这段一并转走哈。

1.6 下集预报

    好了,关于巴别塔的故事完了,记得小的时候有位偶像说过“人的生命是有限的,亡羊补牢是无限的,要把有限的生命投入到无限的亡羊补牢事业中......”,敬请收看下回《补牢》系列之风语者。

补牢(0)

补牢(0)

日期:2007.7
作者:老赵
备注:一点说在前面的话。

有话要说

    有句很有名的话叫“无知者无畏”,形容之前的自己非常恰当,仔细想想有很多基本的东西并不了解,就稀里糊涂的做了一堆项目了,@-_-@@。说不定还稀里糊涂的给别人讲了,想起来好不羞愧啊,好在还活在世上,认识错了的东西可以重新认识,哈哈,人活着真好:)

    以前老赵上学的时候光顾的上玩游戏了,考试全靠考前突击,所以基础知识甚差,很多都是出来挣钱养家以后被迫学的(sweat ...-_-...),并且学的时候因为项目进度所迫,急功近利的囫囵吞枣,导致消化不良,一知半解,(郭冬临出场:吃多了不消化,找江中啊!),吃多了不消化其实再吃什么药都不管用,最好的方法就是把以前吃的都拉出来重新细嚼慢咽的吃一次,哦,当然,不是吃拉出来的(有点e哈 :-P)

    好在传统文化是比较宽容的,自古就有亡羊补牢的故事,也给赵某这种总做错事情的人改正的机会,于是就有了这一系列补牢的文章,算是对自己犯过错误的记录和交代吧。

June 21

Javascript类成员方法中递归时this作用域的问题

标题有点拗口哈,不过举个例子估计就比较明白了。

     前两天老板搞了一个新项目,wmp音乐商店,ms深圳的一帮人在给他做,可能是那边的兄弟表现不是很好(估计是最近暴雨下的了),弄的老板好像很生气,所以让我过来帮着做点脚本方面的小活,有一个下载页面要加进度条,让我给人家写个demo(又是体力活,忍了-_-!!!),没顾上多想,随便写了一个进度条的类,三下五除二,搞定代码。

<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--

function Init()
{
var testchart = new ProcessChart(tdImg,txtRate);
testchart.Show();
}
function ProcessChart(chartId,rateId)
{
this.bar = 0;
this.chart = chartId;
this.rate = rateId;
this.loop = 0;
}
ProcessChart.prototype.Show=function()
   {
    this.bar += 3;
    this.chart.style.width = parseInt(this.chart.style.width) + 10;
    this.rate.value=this.bar+"%";
    if (this.bar<99)
    {
     setTimeout(this.Show(),200);
    }
    else
    {
     return;
    }
   }
//-->
</SCRIPT>
</HEAD>

<BODY onLoad="Init()">
   <table>
    <tr>
     <td style="word-break:break-all;word-wrap:break-word;width:400">
      <TABLE id="tbDLItem">
       <TR>
        <TD style="width:1;height:12" background="chart.jpg" id="tdImg"></TD>
       </TR>
      </TABLE>
     </td>
     <td><input type='text' size='8' name='txtRate' id='txtRate' style='font-family:Arial; color:black;text-align:center; border-width:medium; border-style:none;' readonly>
     </td>
    </tr>
   </table>

</BODY>
</HTML>

     调试,发现有问题,一下循环到底,没有判断递归条件。因为是在wmp里面嵌的页面,不方便用alert调试,又懒得改代码,所以发挥火眼金睛,生看~~~,哈哈,果然被我找到问题所在:setTimeout(this.Show(),200); (其实就这一行关键代码 :-P)

     估计是因为这样写法不太合适?所以改成:setTimeout(this.Show,200); 再调,还是不行,这次是根本没有执行递归,入口的时候就报错,“参数格式错误”。挺郁闷的,难道自己的人品出问题了?

     再仔细想,可能是把this.Show 放进setTimeout 的执行队列以后,再次执行的时候没有办法辨认this 域了,看看把Show 直接写到类定义内部而不用prototype是不是还会有问题,哈哈,果然一切正常。看来就是这个的问题了,所以,只要在以前的基础上加一个变量,把this 的值赋给这个变量就能被识别出来了,修改后的方法为:

ProcessChart.prototype.Show=function()
   {
    var _self = this;
    this.bar += 3;
    this.chart.style.width = parseInt(this.chart.style.width) + 10;
    this.rate.value=this.bar+"%";
    if (this.bar<99)
    {
     setTimeout(function(){_self.Show();},200);
    }
    else
    {
     return;
    }
   }

     其实只改了红色部分的两处,sweat ...-_-....,虽然是小问题,不过以前没有注意过这方面的情况,mark一下。以前写脚本的时候总是只注意功能上实现,很少注意oo思想的应用,才导致这种弱智错误,该打

View more entries