·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3循环语句for、for each、while等语句中使用闭包(2)

时间:2015-09-13 22:24酷播
从我个人的期望上来说,我所理解的闭包,应该能在我定义function的时候就把所有的上下文保存好,这样也就能在调用的时候正确的取到upvalue,也就能正常的输出了。 对于这点,Lua的运行结果正是我需要的,可无奈的是

从我个人的期望上来说,我所理解的闭包,应该能在我定义function的时候就把所有的上下文保存好,这样也就能在调用的时候正确的取到upvalue,也就能正常的输出了。

对于这点,Lua的运行结果正是我需要的,可无奈的是我的主要开发语言是AS3,似乎AS3的闭包实现机制有些问题?循环语句中的 i 是一个引用,而再次调用 f 的时候,拿到的 i 还是原来的那个。

 

查了查资料,事实上早有人遇到过我类似的问题,传送门:http://stackoverflow.com/questions/422784/how-to-fix-closure-problem-in-actionscript-3-as3

所以,也就有了以下的解决方法,看代码:

  1. var arr:Array = []; 
  2. for (var i:int = 0; i < 2; i++)  
  3.     arr.push(test(i)); 
  4.     function test(i:int):Function 
  5.     { 
  6.         return function():void 
  7.         { 
  8.             trace(i); 
  9.         } 
  10.     } 
  11. for each (var f:Function in arr)  
  12.     f(); 

这里做了件很巧妙的事情, test 方法返回了一个 function ,test 方法本身接受一个参数,而函数在传参过程中,类似 i:int 这样的基础类型数据是传值的,也就是说会拷贝一份 i 的复本出来,相同的数据类型还有其他的包括 Boolean 、Number 、String 、uint。

所以当调用 test 方法的时候实际上是保存了一个 i 的复本。然后 arr 再把 test 返回的方法塞进去,因此在调用 arr 中的方法的时候实际上调用的是 test 返回的那个匿名方法。

因此上面的输出就是我们期望的输出:0 1

这算不算一个BUG呢,不完整的闭包吗?

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器