flash – 如何修复ActionScript 3(AS3)中的封闭问题
在下面的代码中,我试图加载一些图像,并把它们一旦他们单独加载在舞台上。但它是错误的,因为只有最后一个图像显示。我怀疑这是一个关闭问题。我该如何解决?在AS3中闭包的行为不是与Java Script中的相同吗?
var imageList:Array = new Array(); imageList.push({'src':'image1.jpg'}); imageList.push({'src':'image2.jpg'}); var imagePanel:MovieClip = new MovieClip(); this.addChildAt(imagePanel,0); for (var i in imageList) { var imageData = imageList[i]; imageData.loader = new Loader(); imageData.loader.contentLoaderInfo.addEventListener( Event.COMPLETE,function() { imagePanel.addChild(imageData.loader.content as Bitmap); trace('Completed: ' + imageData.src); }); trace('Starting: ' + imageData.src); imageData.loader.load(new URLRequest(imageData.src)); } 解决方法
是的,JavaScript的作用完全一样。和Python一样。和别的。 虽然在’for’中定义了’var imageData’,但for循环不会在这些语言中引入新的范围;实际上变量imageData是绑定在包含作用域(外部函数,或在这种情况下它似乎是全局范围)。你可以通过在循环完成执行后查找imageData来确认这一点,并在其中找到imageList的最后一个元素。 因此,只有一个imageData变量,而不是一个循环的每次迭代。当COMPLETE触发时,它进入闭包并读取imageData现在的任何值,而不是在定义函数时(*)。通常情况下,for循环将完成点COMPLETE火灾,imageData将保持最后一个迭代的最后一个元素。 (* – 存在“早期绑定”语言,将在您定义闭包的时候评估变量的值,但ActionScript不是其中之一。) 可能的解决方案往往涉及使用外部函数来引入新的范围。例如: function makeCallback(imageData) { return function() { imagePanel.addChild(imageData.loader.content as Bitmap); trace('Completed: ' + imageData.src); } } ... imageData.loader.contentLoaderInfo.addEventListener(Event.COMPLETE,makeCallback(imageData)); 你/可以/把这个内联,但双嵌套函数()开始变得更难阅读。 另请参见Function.bind()为通用的部分函数应用程序功能,您可以使用来实现这一点。它可能是未来的JavaScript / ActionScript版本的一部分,并可以通过原型在此期间添加到语言。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |