分享
 
 
 

JavaScript写作技巧,函数A中调用函数B, 怎样在函数B中写代码中断函数A的运行?

王朝html/css/js·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

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++){

if (f(this[i],i,this)) return this[i]

}

}

这样不整个世界都清净了吗.

是的,如果我只是简单的写一个find 这样写肯定没问题,但是如果现在我正在写一个复杂的应用,或一个写一个js框架呢

我要实现一系列的

Array.prototype.all

Array.prototype.any

Array.prototype.each

Array.prototype.map

Array.prototype.find

Array.prototype.findAll

Array.prototype.grep

Array.prototype.inject

...... 详细请参见 prototype.js v1.4 有上十种方法等着实现呢,我怎不可能每个方法都用 for循环一个一个的

遍历数组把. 我肯定要实现一个 each 方法作为统一入口吧.

闲话少说,我们来看怎么解决问题:

要在 B函数中终止A函数,并返回结果, 目前我能想到的办法就是用异常 try{}catch(x){}

实现代码

1 <script>

2 // by go_rush(阿舜) @ http://ashun.cnblogs.com

3

4 var $break=new Object()

5

6 Array.prototype.each=function(f){

7 try{

8 for(var i=0;i<this.length;i++){

9 try{

10 f(this[i],i,this)

11 }catch(e){

12 if (e==$break) throw e

13 }

14 }

15 }catch(e){

16 }

17 }

18

19 Array.prototype.find=function(f){

20 var result;

21 this.each(function(value,index,arr){

22 if (f(value,index,arr)){

23 result=value

24 throw $break

25 }

26 })

27 return result

28 }

29

30 var arr=[1,2,3,4,5,7,9]

31

32 function foo(v){ //检测是不是偶数

33 return v%2==0

34 }

35 alert(arr.find(foo))

36

37 </script>

在第24行,如果程序已经找到第一个满足函数返回值为真的元素,那么就抛出一个自定义异常,终止 this.each()的

运行.. 注意第12行,只有确保函数抛出的是自定义异常才继续向上抛出异常,从而终止函数的运行.

在上面的代码中,我用的 try---catch方法完全是用来解决本贴所提出的问题的,并未进行任何其他错误处理.

在这方面,prototype.js ,通过定义两个自定义异常对象 $break 和 $continue ,既照顾到了异常处理,又解决了本贴

提出的问题. Enumerable 对象实现得很优雅, 大家不妨再去体会体会 prototype.js 中Enumerable的妙处.

我们看看prototype.js 是怎么做的,我还是贴出来把

prototype.js的代码片段摘取

var $break = new Object();

var $continue = new Object();

var Enumerable = {

each: function(iterator) {

var index = 0;

try {

this._each(function(value) {

try {

iterator(value, index++);

} catch (e) {

if (e != $continue) throw e;

}

});

} catch (e) {

if (e != $break) throw e;

}

},

all: function(iterator) {

var result = true;

this.each(function(value, index) {

result = result && !!(iterator || Prototype.K)(value, index);

if (!result) throw $break;

});

return result;

},

any: function(iterator) {

var result = true;

this.each(function(value, index) {

if (result = !!(iterator || Prototype.K)(value, index))

throw $break;

});

return result;

},

http://www.cnblogs.com/ashun/archive/2006/11/29/function_call_prototype_break_continue_gorush.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有