|
function funcA(){ funcB(); //other code } 怎么定义函数B,让B在运行的时候不仅能终止B本身,而且能终止函数A的运行?
这是个非常规的问题,我们分两大部分讨论. (1.为什么一定这样做 2.怎么实现)
1. 显然,这种编码方式已经打乱了正规的程序编写原则,我们编写函数的目的就是为了封装,为了实现代码的模块化. 如果B能让A退出返回, 那这种编码方式肯怕比滥用 goto 语句还滥了.
这样做有必要吗?为什么一定要这样做....??
答案如下: 假如我们要扩展Array的prototype. 比方说:定义一个 find方法,用来返回第一个让 执行函数为真的数组元素.
1 <script> 2 // by go_rush(阿舜) @ http://ashun.cnblogs.com 3 4 Array.prototype.each=function(f){ 5 for(var i=0;i<this.length;i++) f(this[i],i,this) 6 } 7 8 Array.prototype.find=function(f){ 9 var result; 10 this.each(function(value,index,arr){ 11 if (f(value,index,arr)) result=value 12 }) 13 return result 14 } 15 16 var arr=[1,2,3,4,5,7,9] 17 18 function foo(v){ //检测是不是偶数 19 return v%2==0 20 } 21 alert(arr.find(foo)) 22 23 </script>
结果另我们大失所望. 首先: 在逻辑上,程序是错误的,因为我们期望返回第一个偶数,但是程序却返回的是最后一个偶数. 其次: 程序的效率是低下的,那怕是找最后一个偶数,他在找到偶数4后,仍然检测了4后面的所有元素.这个动作 是多余的.
怎么办呢? 请看代码中的第11行,如果检测到 f(value,index,arr) 为真的时候,能够直接中断函数 this.each()该多好啊. 效率,结果,双赢的局面.
所以对于问题一 "为什么一定这样做" , 在这里,具体到这个应用上,有足够的理由让函数 B()来中断函数A()
看到这里,你可能会问: 你的 find 方法为什么不这样写?
Array.prototype.find=function(f){ for(var i=0;i<this.length;i++){
[1] [2] [3] [4] 下一页 |