加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 如何修复ActionScript 3(AS3)中的封闭问题

发布时间:2020-12-15 19:50:19 所属栏目:百科 来源:网络整理
导读:在下面的代码中,我试图加载一些图像,并把它们一旦他们单独加载在舞台上。但它是错误的,因为只有最后一个图像显示。我怀疑这是一个关闭问题。我该如何解决?在AS3中闭包的行为不是与Java Script中的相同吗? var imageList:Array = new Array();imageList.
在下面的代码中,我试图加载一些图像,并把它们一旦他们单独加载在舞台上。但它是错误的,因为只有最后一个图像显示。我怀疑这是一个关闭问题。我该如何解决?在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));   
}

解决方法

Isn’t the behaviour of closures in AS3 the same as in Java Script ?

是的,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版本的一部分,并可以通过原型在此期间添加到语言。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读