《Ajax与Atlas开发系列课程》第8讲《设计高质量的Ajax应用》听课笔记

  今天听了微软MVP讲师苏鹏老师的《Ajax与Atlas开发系列课程》第8讲《设计高质量的Ajax应用》,有一些收获,现在与大家共享:
  1.提高软件用户体验的5个方面
    a 响应度:也就是软件在用户操作后要及时给出反馈信息,要么是执行的结果,要么执行时间很长时,给出当前正在执行的操作信息,告知用户等待。
    b 性能:软件执行的效率要高,软件运算结果的时间让用户可以接受,时间太长,用户会选择放弃该软件。
    c 一致性:软件为用户提供的操作该项要统一,在一个软件系统中同一类操作的执行方法应该一致的,这个问题主要在团队开发时容易产生。
    d 易用性:软件的使用要符合用户的操作习惯,而不是满足程序员的操作习惯。
    e 可用性:软件的功能性要完整,否则将不会被用户所接受。
  2.提Javascript程序执行效率的方法
    a 注意循环的执行效率

ContractedBlock.gif ExpandedBlockStart.gif 示例代码
 1None.gif// JavaScript Document
 2ExpandedBlockStart.gifContractedBlock.giffunction fibonacci(count)dot.gif{
 3InBlock.gifvar a=1;
 4InBlock.gifvar b=1;
 5ExpandedSubBlockStart.gifContractedSubBlock.giffor(var i=0;i<count;i++)dot.gif{
 6InBlock.gifvar total=a+b;
 7InBlock.gifa=b;
 8InBlock.gifb=total;
 9ExpandedSubBlockEnd.gif}

10InBlock.gifreturn b;
11ExpandedBlockEnd.gif}

12None.gif
13ExpandedBlockStart.gifContractedBlock.giffunction LoopOne(count)dot.gif{
14InBlock.gifvar total=0;
15ExpandedSubBlockStart.gifContractedSubBlock.giffor (var i=0;i<fibonacci(count);i++)dot.gif{
16InBlock.giftotal+=i;
17ExpandedSubBlockEnd.gif}

18InBlock.gifalert(total);
19ExpandedBlockEnd.gif}

20None.gif
21None.gif
22ExpandedBlockStart.gifContractedBlock.giffunction Looptow(count)dot.gif{
23InBlock.gifvar total=0;
24InBlock.gifvar loopCounter=fibonacci(count);
25ExpandedSubBlockStart.gifContractedSubBlock.giffor (var i=0;i<loopCounter;i++)dot.gif{
26InBlock.giftotal+=i;
27ExpandedSubBlockEnd.gif}

28InBlock.gifalert(total);
29ExpandedBlockEnd.gif}

上面有两个生成菲博纳其数列的例子(LoopOne和LoopTow)其中LoopTow比LoopOne的执行效率高,原因在于LoopOne中每次判断循环是否结束时(i<fibonacci(count))都要去调用一次fibonacci(count)函数,而LoopTow只是在循环开始时去调用一次fibonacci(count)函数(var loopCounter=fibonacci(count)),循环开始后,判断循环是否结束时,只是与变量loopCounter比较(i<loopCounter),这样减少了对fibonacci(count)函数的调用,执行效率当然要高很多。
    b 注意引用层次对执行效率的影响

ContractedBlock.gif ExpandedBlockStart.gif 代码示例
 1None.gif// JavaScript Document
 2None.gif//1
 3None.gifvar hourHand=myGrandFather.clock.hands.hour;
 4None.gifvar minuteHand=myGrandFather.clock.hands.minute;
 5None.gifvar secondHand=myGrandFather.clock.hands.second;
 6None.gif//2
 7None.gifvar hands=myGrandFather.clock.hands;
 8None.gifvar hourHand=hands.hour;
 9None.gifvar minuteHand=hands.minute;
10None.gifvar secondHand=hands.second;

同样是引用对象的属性给变量赋值,第2种写法比第1种写法效率高,原因在于第一种写法对对象属性的引用是三层引用,而第二种写法因为先定义了一个hands变量它指向了myGradnFather.clock.hands对象,当后面再给变量赋值时,其引用关系就变成了一层,引用层次越少,执行效率越高。
  3.防止Javascript程序内存泄漏
  虽然有垃圾回收机制,但这不能完全保证程序使用的内存被完全回收,代码中还应该注意把对象的所有引用都注销,如以下代码:

ContractedBlock.gif ExpandedBlockStart.gif 示例代码
 1None.gif// JavaScript Document
 2ExpandedBlockStart.gifContractedBlock.giffunction Person(name)dot.gif{
 3InBlock.gifthis.name=name;
 4InBlock.gifthis.pets=new Array();
 5ExpandedBlockEnd.gif}

 6None.gif
 7ExpandedBlockStart.gifContractedBlock.gifPerson.prototype.addPet=function(pet)dot.gif{
 8InBlock.gifthis.pets[pet.name]=pet;
 9ExpandedSubBlockStart.gifContractedSubBlock.gifif (pet.assignOwner)dot.gif{
10InBlock.gifpet.assignOwner(this);
11ExpandedSubBlockEnd.gif}

12ExpandedBlockEnd.gif}

13None.gif
14ExpandedBlockStart.gifContractedBlock.gifthis.removePet(petName)=functiondot.gif{
15InBlock.gifvar orphan=this.pets[petName];
16InBlock.gifthis.pets[petName]=null;
17ExpandedSubBlockStart.gifContractedSubBlock.gifif (orphan.unassignOwner)dot.gif{
18InBlock.giforphan.unassignOwner(this);
19ExpandedSubBlockEnd.gif}

20ExpandedBlockEnd.gif}

21None.gif
22None.gif//定义宠物猫
23ExpandedBlockStart.gifContractedBlock.giffunction Cat(name)dot.gif{
24InBlock.gifthis.name=name;
25ExpandedBlockEnd.gif}

26ExpandedBlockStart.gifContractedBlock.gifCat.prototype.assignOwner=function(person)dot.gif{
27ExpandedBlockEnd.gif}

28ExpandedBlockStart.gifContractedBlock.gifCat.prototype.unassignOwner=function(person)dot.gif{
29ExpandedBlockEnd.gif}

30None.gif//定义宠物狗
31ExpandedBlockStart.gifContractedBlock.giffunction Dog(name)dot.gif{
32InBlock.gifthis.name=name;
33ExpandedBlockEnd.gif}

34ExpandedBlockStart.gifContractedBlock.gifDog.prototype.assignOwner=function(person)dot.gif{
35InBlock.gifthis.owner=person;
36ExpandedBlockEnd.gif}

37ExpandedBlockStart.gifContractedBlock.gifDog.prototype.unassignOwner=function(person)dot.gif{
38InBlock.gifthis.owner=person;
39ExpandedBlockEnd.gif}

40None.gif
41None.gif//定义人类
42None.gif    var jim=new Person("jim");
43None.gif    jim.addPet(new Cat("whiskers"));//这里系统内建了一个猫
44None.gif    var fido=new Dog("fido");
45None.gif    jim.addPet(fido);
46None.gif    
47None.gif    jim.removePet("whiskers");
48None.gif    jim.removePet("fido");
49None.gif    jim=null;
50None.gif    //到此为止我们的jim先生还在吗?
51None.gif    fido=null;

虽然显示的把人对象jim设为了null(jim=null),但此时jim对象在内存中依然存在,因为在对象fido的ower中还有对jim的引用,所以垃圾回收机制还不会把jim对象占用的内存回收,要让垃圾回收机制回收jim占用的内存,必须加一句fido=null,这时所有对jim的引用已经清除,内存回收机制此时才会把jim占用的内存回收。

转载于:https://www.cnblogs.com/liaozq/archive/2006/07/08/446069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值