[AS3]as3循环语句for、for each、while等语句中使用闭包(2)
从我个人的期望上来说,我所理解的闭包,应该能在我定义function的时候就把所有的上下文保存好,这样也就能在调用的时候正确的取到upvalue,也就能正常的输出了。
对于这点,Lua的运行结果正是我需要的,可无奈的是我的主要开发语言是AS3,似乎AS3的闭包实现机制有些问题?循环语句中的 i 是一个引用,而再次调用 f 的时候,拿到的 i 还是原来的那个。
查了查资料,事实上早有人遇到过我类似的问题,传送门:http://stackoverflow.com/questions/422784/how-to-fix-closure-problem-in-actionscript-3-as3
所以,也就有了以下的解决方法,看代码:
- var arr:Array = [];
- for (var i:int = 0; i < 2; i++)
- {
- arr.push(test(i));
- function test(i:int):Function
- {
- return function():void
- {
- trace(i);
- }
- }
- }
- for each (var f:Function in arr)
- {
- f();
- }
这里做了件很巧妙的事情, test 方法返回了一个 function ,test 方法本身接受一个参数,而函数在传参过程中,类似 i:int 这样的基础类型数据是传值的,也就是说会拷贝一份 i 的复本出来,相同的数据类型还有其他的包括 Boolean 、Number 、String 、uint。
所以当调用 test 方法的时候实际上是保存了一个 i 的复本。然后 arr 再把 test 返回的方法塞进去,因此在调用 arr 中的方法的时候实际上调用的是 test 返回的那个匿名方法。
因此上面的输出就是我们期望的输出:0 1
这算不算一个BUG呢,不完整的闭包吗?
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例