ActionScript 2功能

时间:2020-03-06 14:48:39  来源:igfitidea点击:

我是一位经验丰富的程序员,但是刚开始使用Flash / Actionscript。我正在做一个由于某些原因需要我使用Actionscript 2而不是3的项目。

当我运行以下命令(我只是将其放在新的Flash项目的第一帧中)时,输出为3而不是1?我需要成为1.

为什么'ii'变量的范围在循环之间继续?

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1; 
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();

解决方案

不幸的是,Actionscript 2.0的范围不广……尤其是在时间轴上。

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1;     
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();
trace("out of scope: " + ii + "... but still works");

不幸的是,AS2不是那种语言。它没有那种关闭。函数并不是AS2中的一等公民,其结果之一是函数不会保留其自身的范围,因此在调用它时必须将其与某个范围相关联(通常与该函数所在的范围相同)本身是已定义的,除非我们使用函数的"调用"或者"应用"方法)。

然后,在执行该函数时,其中的变量范围就是我们遇到的任何情况的范围,即循环之外的范围。这也是为什么我们可以执行以下操作的原因:

function foo() {
    trace( this.value );
}

objA = { value:"A" };
objB = { value:"B" };

foo.apply( objA ); // A
foo.apply( objB ); // B

objA.foo = foo;
objB.foo = foo;

objA.foo(); // A
objB.foo(); // B

如果我们习惯了真正的OO语言,那么这看起来很奇怪,原因是AS2最终是一种原型语言。看起来所有面向对象的事物都是巧合。 ; D

我想出了一种解决自己问题的策略:

var fs:Array = new Array();

for (var i = 0; i < 3; i++){    
    var ii = i + 1;   

    f = function(j){
        return function(){
            trace(j);
        };
    };
    fs[i] = f(ii);
}

fs[0](); //1
fs[1](); //2
fs[2](); //3