Monthly Archives: 一月 2013

Hello World 业界杂谈

巧用setTimeout提高UI响应速度

关于javascript的性能问题,争议最多的就是它的单线程:UI渲染与更新数据跑在一个线程里,如果碰上比较耗时的数据运算或者DOM操作,UI就会很卡,特别是对IE6、7这些古董级的东西,这个问题会特别明显。
这里不想分辨单线程到底是优点还是缺点,只想所说如何通过setTimeout规避这种问题。
比如本博客上面红色的导航条(嘿嘿,换了皮肤,这个还没加),当滚动条向下滚动时,通过修改css的position值,菜单条会变成悬浮在页面顶端的,在页面滚动过程中,js会不断检查当前滚动条的位置,直到导航条回到初始位置时,再将其定位回该位置。
由于要不停的访问DOM,取得滚动条的高度,这段代码在IE6、IE7里是很卡的,以至于刚开始的时候,我在这段逻辑的开头加了浏览器类型的判断,如果是IE,干脆不再执行这段代码~~~直到加入了下面这段优化以后

1
2
3
4
5
6
7
8
var scroolTime = null;
$(window).bind('scroll.top', function(){
  scroolTime && clearTimeout(scroolTime);
  scroolTime = setTimeout(scroolFun, 0);
});
var scroolFun = function(){
  //.....检查页面高度、设置菜单条css的逻辑
}

上面这段代码的核心就是“setTimeout(xxxx, 0);”,咋一看,定时为0不是等于没定时嘛,其实不然,即使定位为0,setTimeout也不会立即执行定时的function,而是在当前线程空闲时才会执行,也就是说,     随着滚动条的滚动,js逻辑会等喜面的代码跑完,且ui渲染完了以后再去调用     scroolFun。而“clearTimeout(scroolTime)”会保证定时队列里只有一个待执行的scroolFun

再比如,以前做的的一个需求,在js内上有一个几十到上千条的数组,数组内保存的通讯录的实体,页面上要求可以对通讯录做搜索。如果照正常的逻辑,需要将整个数组跑一遍循环,再将符合条件的结果集显示到页面上。特别是在做搜索的时候,需要支持随着用户输入的时时搜索,这种情况下,如果数组长度过千,即便是chrome这样的高端浏览器,页面操作仍然不回很流畅。
这是又到了setTimeout派上用场的时候了:每次对数组搜索时,只搜索10到100条不等的一段,搜索完这一段即将满足条件的结果显示到页面上,然后setTimeout(‘分段搜索function(start, length)’, 0),等待线程空闲以后,再继续搜索下一段。
然后在用户修改搜索关键字时,记得要将上面的定时clearTimeout掉。
具体每次的搜索长度,可以根据浏览器不同来定义,不如IE6,每次只能搜索10条,而chrome每次搜索几百条。
—————-

Hello World 他山石 点点滴滴

你真的会用javascript吗?

偶然在csdn看到几个js的小题,考察的都是很基础的知识,拿来分享一下
1.

1
2
3
4
if (!("a" in window)) {
  var a = 1;
}
alert(a);

开始,我以为是1,后来试了下,结果是undefined,仔细看看,也对:js在执行是,会首先提取所有var的新变量,让后给其赋值undefined,并将其加入到当前的执行环境总,比如这里,程序还没执行,实际就有了window.a=undefined,所以“(“a” in window)==true”
2.

1
2
3
4
5
var a = 1;
var b = function a(x) {
  return x*x;
};
alert(a);

一直以为这种写法会报错,汗颜的是,前段时间去某家公司面试,还碰上了类似的题目,回来也没写写试试。
实际试了下,这里的alert仍然是1,这种写法,a只在function a的内部是function,但是如果在a内部调用a(x),会递归
3.

1
2
3
4
5
function a(x) {
    return x * 2;
}
var a;
alert(a);

呵呵,有了第一个题,这个就比较简单了,function
4.

1
2
3
4
5
function b(x, y, a) {
    arguments[2] = 10;
    alert(a);
}
b(1, 2, 3);

这个也简单,arguments[2]就是a的替身,a会被修改为10
5.

1
2
3
4
function a() {
    alert(this);
}
a.call(null);

这里考察的是call的使用,正常call的参数是什么,里面的this就是什么(我也是这么理解的),但是关于call还有一条说明:如果call的参数是null或者undefined,里面的this仍然是当前执行环境,即window
————-
参考:http://bbs.csdn.net/topics/390300541

Hello World 业界杂谈

eclipse设置空格代替tab

随着node.js的流行,js的书写方式正在悄然发生变化。
node.js里异步编程的大量使用,回调越来越多,缩进也就越来越多,以前,习惯了tab/四个格的缩进,现在发现这种缩进方式对代码越多影响越来越大:缩进太多,内层的代码要靠拖动水平滚动条才能看到;另外,tab键在各个IDE里显示的空格个数是不同的,2~8个不等。
所以,就准备修改自己js的书写习惯:用两个空格代替tab。
但是,如果真的手敲空格又缺失太麻烦,还好大部分IDE都会提供使用空格代替tab的的功能,即敲tab后,实际产生的是另个空格。
下面介绍一下eclipse的设置方式,如下图,首先打开eclipse的“偏好设置”,找到图中所示的选项:

在Formatter找到“Active profile”,不要直接修改系统默认的profile,点下面的New,新建一个,然后打开,如下图所示:

在第一个选项卡里找到General settings -> tab policy,右侧的下拉改为“Spaces only”,下面的两个“size”都改成2,保存推出即可
———

日志

修改ipad备份到mac上的位置

通过iTunes可以备份ios设备到mac系统内,但是ios设备的容量越来越大,备份时占用的空间也就越来越大
如果你装了双硬盘,mac系统装在容量较小的SSD上,而iTunes并不能修改备份未知,这种事情就会很讨厌了,本就不大的SSD会被备份数据挤占大量的空间,能不能备份的空间更大的机械硬盘上?
当然可以!
网上搜索解决方案,说是可以在大硬盘上建一个Backup文件夹,让后制作一个替身,放到SSD上对应位置
试了试,通过右击建立的替身是不行的,进一部搜索找到了解决方法:使用ln命令制作替身

ln -s /Volumes/Library/Backup/MobileSync/Backup /JKL/Library/Application\ Support/MobileSync/Backup
#即:
ln -s 实际位置 替身位置
#ps:“Library/Application Support/MobileSync/Backup”是iTunes的默认备份位置

————-
参考:http://hiraku.tw/2011/01/2416/

日志

2013,新年快乐

回顾2012,前11个月都是四平八稳,平平淡淡:工作,天天挤公交上班;生活,也是平淡如水;去了几个好玩的地方,拍了一堆照片(呵呵,后面会补一个图片专题);看书的时间越来越少,偶尔拿手机听听评书,算是弥补一下下,只有刷微博的时间越来越多;偶尔还会随着家人看会电视~~
当然,最让人高兴的还是女儿健健康康,快快乐乐的成长,会走路,会叫爸爸妈妈~~感谢老婆和丈母娘的悉心照顾~~O(∩_∩)O哈哈~~
刚才说前11个月的工作都很稳定,其实,稳定在正是在酝酿变化,一个爱折腾的人是不会甘心平静这么久的~~11月底开始寻找新工作,12月中旬,离职-换工作,一气呵成~~总算在2012年即将结束的时候完成了一件大事

对于2013,本来并没有什么很强烈的愿望,只希望家人平平安安健健康康,工作顺顺利利就ok了
可昨天突然发现,1983-2013,自己已经30岁了(汗,真的是突然发现~~God & 老天爷!泪流满面ing)
然后,就给自己的2013种下了一个愿望:希望可以在30岁生日之前完成人生的另一件大事:买房
北京的房价让人很无奈,可以总要有一个自己的窝呀。。。哪怕远点、小点
————–
面对房子的压力,来给自己寻找点信心吧:
刚才翻箱倒柜,用遍了百度、google,总算在sina找到了自己几年前的blog地址,不为别的,只为里面有一篇《2008,新年寄语》,看浏览记录,5年了,这篇文章也没什么人看过~~但是这篇文章所描述的当时的心情,对我却有非凡的意义。
2007年末的我,毕业半年,工作不顺心,刚刚从深圳一个电子厂辞去了IQC的职务,整个人都被强烈的失败感笼罩着。在一次招聘会上偶然听说还有专门做java培训的公司,于是在经过一番调查以后报了一个北京的java培训班,春节一过,就一个人跑到帝都来,从此过上了北漂+程序猿的日子。真的很佩服那个时候的自己,在两眼一抹黑的情况下,能够下决心放弃刚刚做顺手的QE工作,转行、换地方~~~哈哈,单身就是好,想去哪儿就去哪儿
那篇文章的结尾是这么写的:

好了,2008来了,对我来说没有奥运圣火,有的只是再次点燃的希望之火。
为了这个并不渺茫的希望,我要做得只有一点:努力!

————–