多重循环在编程中会常常遇到,那么在JavaScript中如何指定跳出那层的循环呢。其实这也是break的一个用法,下面是一个不错的例子,来自《JavaScript权威指南》,能够参考下:javascript
<script type="text/javascript"> outerloop://命名外圈语句 for(i=0; i<10; i++) { innerloop://命名内圈语句 for(j=0; j<10; j++) { // 跳出内圈循环 if(j>3){break;} // 跳出内圈循环 if(i==2){break innerloop;} // 跳出外圈循环 if(i==4){break outerloop;} document.write("i = "+i+" , j = "+j+"<br />"); } } document.write("final"+" i = "+i+" , j = "+j); </script>
程序运行结果:java
i = 0 , j = 0 i = 0 , j = 1 i = 0 , j = 2 i = 0 , j = 3 i = 1 , j = 0 i = 1 , j = 1 i = 1 , j = 2 i = 1 , j = 3 i = 3 , j = 0 i = 3 , j = 1 i = 3 , j = 2 i = 3 , j = 3 final i = 4 , j = 0
另一个例子:强行跳出递归node
错误的写法:编程
function getFirstParentNode(node){ if(node.getParentNode() != null){ getFirstParentNode(node.getParentNode()); }else{ return node; } }
根据某节点获取他最顶层节点,若是这么写,发现return后仍是会执行递归oop
正确的写法:ui
function getFirstParentNode(node){ if(node.getParentNode() != null){ return getFirstParentNode(node.getParentNode()); }else{ return node; } }
项目中的一个例子:spa
循环easyui的treegrid的每一个子节点,找到和传入参数listCode相等的子节点code
var returnCcTypeMask = false; //var rows = $('#id').treegrid('getData');//这个是获取全部一级节点 function getCcTypeMaskFlag(rows,listCode){ if(rows && rows.length >0){ for(var i = 0;i<rows.length;i++){ var row = rows[i]; if(row.children.length>0){ //这里return 必须加上,不然无论是否找到code == listCode,都会把全部节点所有循环完 if(!returnCcTypeMask){ getCcTypeMaskFlag(row.children,listCode); }; }else{ if(!returnCcTypeMask){ var code = rows[i].listCode; if(code == listCode){ var ccTypeMask = rows[i].ccTypeMask; if(ccTypeMask == 1 || ccTypeMask ==2 || ccTypeMask ==3 || ccTypeMask ==4){ returnCcTypeMask = true;//显示提示信息框 } return returnCcTypeMask; } }else{ return returnCcTypeMask; } } } } return returnCcTypeMask; }
在循环每一个节点的时候,若是该节点有子节点,那么循环该节点的全部子节点,这里必需要定义一个所有变量,用来判断递归是否继续进行:var returnCcTypeMask = false;递归
若是不这么写,只是在找到的这个节点和参数listCode相等,就return,也是不行的,这个return 只是跳出当前这个循环,可是当前循环的上层循环仍是会继续进行,因此这里用所有变量来控制,因此在if(code == listCode)的时候,利用return 跳出当前循环,因而进入上级循环,在上层循环中根据全局变量returnCcTypeMasky的值来判断是否要跳出上层循环,若是returnCcTypeMasky为true,会跳出全部循环ip