转自:泽欣 http://www.javayou.com/showlog.jspe?log_id=700&cat_id=3
今天看到微软网站上的脚本(就javascript脚本源码来说,微软比google是开放的),发现了很多 do{......}while(false) 这样的代码,乍一看来,好像是相当多余的。因为教科书里都告诉我们,do...while 是一种循环语句,非常类似于while 循环,只是它在每次循环结束时检查表达式是否为真,而不是在循环开始时。那么 do{...}while(false)的写法说明 do{} 中的部分也只会执行一次,那这样的写法有什么必要呢?
通过细看明微软的代码,明白了其意,举例来说:
- function LTrim(s){
- try{
- do{
- if(null==s||s.length<=0)
- break;
- var whitespace=" \t\r\n";
- if(whitespace.indexOf(s.charAt(0))>=0){
- var len=s.length;
- var index;
- for(index=0;index
- if(whitespace.indexOf(s.charAt(index))<0)
- break;
- }
- if(index
- s=s.substring(index);
- else s="";
- }
- }while(false);
- }catch(Ab){
- s="";
- }
- return s;
- }
这个函数是用来去掉字符串前端的空白,我不多说,代码很简单,为什么要使用do...while(false)的用意就在于在do{}的过程中可以break,使得函数唯一的出口就是最后一行的return。
标题我本来想叫做 "do...while(false)的妙处",后来又觉得不妥,于是最后两字改成了探讨,我想一定会有人不屑或反对do...while语法这样的运用,也会有人赞同,见仁见智。
也看过不少 java 的源码,这样的写法相当少,也许对于jvm来说,这样的效率反而是降低的,我没有用javap来做一番分析,因为我对虚拟机没有深入的了解。有朋友有兴趣如果能给出详细的比较,不甚感激。
就我个人的意见,如果一个函数很长,有多处return的可能的话,do...while(false)还是有助于避免一些隐患的。